โ—† DOCS v1.0.3 ยท LAST UPDATED 2026-04-19 โ—† CORE CONTRACTS AUDITED BY SPEARBIT + TRAIL OF BITS โ—† API RATE LIMIT 120 RPM / KEY โ—† OPEN SOURCE MIT LICENSE โ—† CONTRIBUTE ON GITHUB โ—† โ—† DOCS v1.0.3 ยท LAST UPDATED 2026-04-19 โ—† CORE CONTRACTS AUDITED BY SPEARBIT + TRAIL OF BITS โ—† API RATE LIMIT 120 RPM / KEY โ—† OPEN SOURCE MIT LICENSE โ—† CONTRIBUTE ON GITHUB โ—†
liquid / docs / introduction
โ—† introduction ยท read time 4 min

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.

โ—† version 1.0.3 ยท last updated 2026-04-19 ยท contracts at 0x4f2aโ€ฆ91cc ยท edit on github โ†—

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.

โ—†
tl;dr โ€” bring 100+ ฮž, a ticker, and a logo. one transaction deploys the token, seeds the pool, locks the LP, and lists you in the explorer. the whole thing usually finishes in under 90 seconds.

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}`);
โœ“
that's it. the SDK bundles six calls into a single transaction. if any step fails, the whole thing reverts โ€” there is no half-deployed state.

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:

  1. minimum pair. a launch cannot deposit less than 100 ฮž. attempting a smaller pair reverts with PairTooThin().
  2. recommended pair. the UI defaults to 340 ฮž and flags launches under that threshold as "thin" in the explorer.
  3. 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
!
slippage grows quadratically with trade size. doubling depth quarters the slippage on any given buy.

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

fieldtypemeaning
positionIduint256uniswap v3 NFT token id
depositoraddresswallet that launched the pool
unlockAtuint64unix timestamp, at least +24 months
feeRecipientaddresswhere the 50% creator share accrues; mutable
permanentboolif true, the NFT can never be withdrawn
!
there is no admin override. once an LP is in the vault, no liquid team member, dao, or emergency multisig can pull it out. the vault contract has no 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 feeRecipient set 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.

contractaddresspurpose
LiquidFactorynot deployedentrypoint for launches
UniswapV3 PositionManager0xC36442b4a4522E87a38c01c72B4d4193f1ab0063holds LP NFTs
UniswapV3 SwapRouter020x68b3465833fb72B5a828cCEBEA90AD60f7934fACroutes swaps
WETH90xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2wrapped 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

GET /v1/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

POST /v1/pools/{address}/simulate

estimate output amount and slippage for a prospective trade without broadcasting a tx.

paramtypedescription
ethInstringamount of ETH to swap in, as decimal string
direction"buy" | "sell"trade direction
maxSlippageBpsnumberoptional; 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.

โ—†
for responsible disclosure of anything that doesn't fit the bounty scope, email security@liquid.fi with a PGP-encrypted payload. key fingerprint: A81F 2E4C 1C3D 7B90 88C6 F44A 88BA 18E2 07CF 91AA.
โ† previous
introduction