the liquid manual.
everything you need to launch a token, trade a pool, or build on top of liquid. start here if this is your first visit.
what is liquid?
liquid is a token launchpad on ethereum mainnet. it is opinionated: every token launched on liquid is paired with a minimum of 100 ฮ against a uniswap v3 position, the LP NFT is locked in a vault for 24 months, and 50% of every trade fee is recycled back into the pair.
the whole design exists because we are tired of thin-curve launchpads where one 2 ฮ buy moves price 80%, then the team rugs. liquid makes that math mechanically impossible from block zero.
who is this for?
- project founders who want a serious launch instead of a pump.fun graduation lottery.
- traders who are tired of eating 40% slippage on every swap above 2 ฮ.
- integrators building wallets, aggregators, analytics, or bots on top of the liquid pool set.
quickstart
install the sdk:
# npm npm install @liquid/sdk # pnpm pnpm add @liquid/sdk # yarn yarn add @liquid/sdk
launch a token in 12 lines of typescript:
import { Liquid } from "@liquid/sdk"; const liquid = new Liquid({ chain: "mainnet", signer }); const { pool, token, txHash } = await liquid.launch({ name: "Wetcoin", symbol: "WET", supply: 1_000_000_000n, pairDepth: ethers.parseEther("340"), // 340 ฮ lpAllocation: 0.80, // 80% to pool feeTier: 10000, // 1.00% lockMonths: 24, }); console.log(`live at ${pool}`);
thick liquidity
a pool is "thick" when its reserves are large relative to typical trade size. the thicker the pool, the less price moves per unit of ETH traded. liquid enforces thickness with three knobs:
- minimum pair. a launch cannot deposit less than 100 ฮ. attempting a smaller pair reverts with
PairTooThin(). - recommended pair. the UI defaults to 340 ฮ and flags launches under that threshold as "thin" in the explorer.
- fee recycling. half of every trading fee is deposited back into the pair, so depth grows monotonically over time.
the math
for a constant-product pair with reserves (x, y), slippage on a buy of size dx is:
slippage(dx) = (x + dx)ยฒ / xยฒ โ 1 // at x = 3 ฮ, dx = 1 ฮ โ +78% slip // at x = 340 ฮ, dx = 1 ฮ โ +0.3% slip // at x = 340 ฮ, dx = 5 ฮ โ +1.5% slip
lp locks & vaults
when you launch on liquid, the uniswap v3 position NFT does not go to your wallet. it is transferred to
liquid_vault.sol and stamped with an unlockAt timestamp.
only after that timestamp passes can the original depositor reclaim the NFT โ and only via a 48-hour timelock.
vault parameters
| field | type | meaning |
|---|---|---|
positionId | uint256 | uniswap v3 NFT token id |
depositor | address | wallet that launched the pool |
unlockAt | uint64 | unix timestamp, at least +24 months |
feeRecipient | address | where the 50% creator share accrues; mutable |
permanent | bool | if true, the NFT can never be withdrawn |
onlyOwner functions.fee recycling
every swap against a liquid pool accrues fees to the locked LP. those fees are claimable at any time by calling vault.collect(positionId). when collected, they are split three ways:
- 50% โ re-deposited into the same LP position as additional pair liquidity (this is the "thickening").
- 45% โ sent to the
feeRecipientset by the depositor (typically the creator). - 5% โ sent to the liquid treasury for audits, UI hosting, and buyback of the governance token.
the 50/45/5 split is fixed at the protocol level. it cannot be changed per-pool.
core contracts
all contracts are verified on etherscan and deployed to mainnet at the addresses below.
| contract | address | purpose |
|---|---|---|
LiquidFactory | not deployed | entrypoint for launches |
UniswapV3 PositionManager | 0xC36442b4a4522E87a38c01c72B4d4193f1ab0063 | holds LP NFTs |
UniswapV3 SwapRouter02 | 0x68b3465833fb72B5a828cCEBEA90AD60f7934fAC | routes swaps |
WETH9 | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 | wrapped ETH |
launch() signature
function launch( LaunchParams calldata params ) external payable returns ( address token, address pool, uint256 positionId ); struct LaunchParams { string name; string symbol; uint256 supply; uint256 pairDepth; // in wei, >= 100 ether uint16 lpAllocationBps; // 10000 = 100% uint24 feeTier; // 500 | 3000 | 10000 uint32 lockSeconds; // >= 2 years bool antiSnipe; bytes32 metadataHash; // ipfs cid of the json }
rest api
base url: https://api.liquid.fi/v1 ยท rate limit 120 requests / minute / key.
list pools
curl https://api.liquid.fi/v1/pools?sort=volume_24h&limit=25 \
-H "x-api-key: $LIQUID_KEY"
returns an array of pool objects:
[
{
"symbol": "WET",
"name": "Wetcoin",
"address": "0x7e4dโฆa102",
"pairDepth":"340.00",
"priceUsd": 0.00142,
"mcapUsd": 1420000,
"change24h": 0.342,
"volume24h": 842000,
"holders": 288,
"launchedAt":"2026-04-22T08:14:02Z",
"unlockAt": "2028-04-22T08:14:02Z"
}
]
simulate a buy new
estimate output amount and slippage for a prospective trade without broadcasting a tx.
| param | type | description |
|---|---|---|
ethIn | string | amount of ETH to swap in, as decimal string |
direction | "buy" | "sell" | trade direction |
maxSlippageBps | number | optional; returns would_revert: true if exceeded |
audits & security
the core contracts have been independently audited twice:
- Spearbit โ full review of factory + vault, 3 low-severity findings, all resolved ยท report โ
- Trail of Bits โ fuzzing campaign against the router, 1 medium finding (rounding), resolved ยท report โ
bug bounty
liquid runs a $500,000 immunefi bounty for the core contracts. critical vulnerabilities pay out up to the full cap; see the immunefi page for the full scope and severity grid.
security@liquid.fi with a PGP-encrypted payload. key fingerprint: A81F 2E4C 1C3D 7B90 88C6 F44A 88BA 18E2 07CF 91AA.