Developer docs · @squeez/sdk

Build on Squeez

An instant-liquidity token launchpad on Robinhood Chain (chain id 4663), built on single-sided Uniswap V4 positions with a hook that owns the fees. Launch, quote and trade tokens from one TypeScript SDK.

Overview

What is Squeez

Every token launches tradable on Uniswap V4 from block zero — no gatekept bonding-curve phase, no migration step, no middleman.

At launch, 100% of supply is seeded as single-sided Uniswap V4 liquidity and burned forever. The single-sided positions are the bonding curve — Uniswap does the swap math while the hook owns the fees and launch protections. There is nothing to migrate and no separate liquidity event.

Instant liquidity

Tradable on Uniswap V4 the moment it launches — live from block zero.

Single-sided & burned

Supply is seeded single-sided as V4 position NFTs minted to 0x…dEaD — verifiably burned, no removal path. No migration, no middleman.

Forever tail

A tail position runs to the max tick, so the curve never meaningfully sells out.

True FDV

Prices are set on the full supply, so market caps you see are real FDV.

Economics

Fees

The pool's static LP fee is 0 — the hook is the sole fee engine, and every fee is taken in WETH on every swap. The creator picks one fee kind at launch, and it is immutable afterward.

Standard

base + anti-snipe

An always-on base fee (chosen in 0.25%–10%) plus an optional anti-snipe surcharge that sits on top and decays to zero over time. Set the surcharge to zero for a flat base fee.

Meme mode

mcap-decaying

A fee that decays with market cap — it starts high (capped at 1%) and falls to a floor (default 0.1%) by a target FDV (default 500 ETH), so high-cap traders pay less.

The split. The protocol takes a fixed 10% of every fee. The creator and partner split the remaining 90% — with no partner, the creator keeps it all. Fees accrue as WETH ERC-6909 claims inside the hook and are redeemed on demand. The creator's slice can be routed through the flywheel (below).

Economics

Flywheel mode

Optional at launch: split the creator's WETH fee slice across up to five buckets that must sum to 100%. Reflections and WETH rewards accrue to non-contract (EOA) holders only, as two claimable streams. A permissionless harvest processes the accrued fees.

Reflections

Buys the token and distributes it to holders as a claimable per-share stream (a token dividend) — balanceOf is a plain ERC-20 balance.

WETH rewards

Accrues pro-rata to holders and is claimed/pushed as native ETH (unwrapped).

Buyback & burn

Buys the token with WETH and burns it, shrinking supply.

Auto-LP

Adds permanently-locked liquidity to the token's pool.

Creator

The residual, paid straight to the creator (the classic creator fee).

The default routes 100% to the creator (no flywheel). Anyone can call harvest(poolKey) to process the pot. Both reward streams are then claimable: a holder calls claim() for both, claimWeth() (paid as native ETH) or claimReflection() for one, and reads withdrawableWeth / withdrawableReflection. A permissionless keeper can push both to holders with claimForMany(holders[]). Set it up via the launch wizard or flywheelLaunch / the flywheel() SDK helper.

Reference

Deployed contracts

The v3 protocol, live on Robinhood Chain (chain id 4663) and verified on Blockscout. The @squeez/sdk ships these addresses, so integrators don't hard-code them.

Launch LP is burned via the V4 PositionManager. Each launch mints its two single-sided positions (main band + forever tail) as position NFTs to 0x000000000000000000000000000000000000dEaD, so the liquidity is provably unremovable and visible on explorers — on top of the existing no-removal-path guarantee. Launch tokens are also renounced: LaunchToken.owner() returns address(0) (fixed supply, no mint, pause, or blacklist).

Legacy v2. v2 is no longer used for new launches, but its tokens stay indexed and tradable and keep their original behavior (elastic auto-rebasing reflections, WETH-denominated rewards). Its core addresses:

SDK

Quickstart

Install @squeez/sdk (viem is a peer dependency). It mirrors the on-chain launch math bit-for-bit, so configs and swap quotes match the chain exactly.

$pnpm add @squeez/sdk viem

Launch a token in a few lines

typescript
import { createPublicClient, createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { createLaunchpad, fairLaunch, robinhoodChain, WETH_ADDRESS } from "@squeez/sdk";

const account = privateKeyToAccount(process.env.PK as `0x${string}`);
const publicClient = createPublicClient({ chain: robinhoodChain, transport: http() });
const walletClient = createWalletClient({ account, chain: robinhoodChain, transport: http() });

const squeez = createLaunchpad({ publicClient, walletClient });

// Canonical fair launch: 3 ETH FDV start, 20 ETH FDV at 70% of supply sold, 1e9 supply, 1% WETH fee.
const config = fairLaunch({ quoteToken: WETH_ADDRESS });
const { configId } = await squeez.createConfig(config); // immutable + reusable

// launch() mines a vanity salt client-side (token sorts below WETH AND ends in 0x4663),
// then deploys the token, seeds the main band + forever tail single-sided, and burns it.
const { token, poolId } = await squeez.launch({
  configId,
  name: "Feather",
  symbol: "FTHR",
  tokenURI: "ipfs://...",
  onMineProgress: (n) => console.log(`mining vanity salt… ${n} tries`),
});

// Quote a buy locally with the exact on-chain V4 math.
const quote = await squeez.quoteBuy({ token, quoteIn: 10n ** 18n });

Presets & overrides — fairLaunch, instantLaunch, memeLaunch

typescript
import { fairLaunch, memeLaunch, flywheel, antiSnipe, devReserve, WETH_ADDRESS } from "@squeez/sdk";

// Meme mode: the fee decays with market cap — 1% at launch → 0.1% floor by 500 ETH FDV.
const memeCfg = memeLaunch({ quoteToken: WETH_ADDRESS });

// Flywheel: route the creator's WETH fee slice (buckets are bps, must sum to 10_000).
const flywheelCfg = fairLaunch({
  quoteToken: WETH_ADDRESS,
  overrides: {
    ...flywheel({
      reflectionsBps: 2_500,   // token bought back, distributed to holders as a claimable stream
      wethRewardsBps: 2_500,   // accrues per holder, claimed/pushed as native ETH
      buybackBurnBps: 2_000,
      autoLpBps: 1_000,
      residualCreatorBps: 2_000,
    }),
  },
});

// Compose fragments onto any preset via `overrides`:
const guarded = fairLaunch({
  quoteToken: WETH_ADDRESS,
  overrides: {
    ...antiSnipe({ startBps: 9_000, durationSecs: 3_600 }), // decaying launch tax
    ...devReserve({ bps: 1_000, vestCliffSecs: 2_592_000 }), // 10% reserve, 30-day cliff
  },
});

// Later: process the flywheel, then holders collect their rewards.
await squeez.harvest({ token });

// Two claimable streams: WETH rewards (paid as native ETH) + reflection tokens.
const ethOwed        = await squeez.getWithdrawableWeth(token, holder);
const reflectionOwed = await squeez.getWithdrawableReflection(token, holder);

await squeez.claim({ token });      // claims BOTH streams (native ETH + reflections)
await squeez.claimWeth({ token });  // or just the ETH stream

// Permissionless keeper: push both streams straight to holders, no action from them.
// (on the token) claimForMany([holderA, holderB, ...]) — also claimFor / claimReflection.

Trading routes through the canonical Uniswap V4 Universal Router — the SDK's buildSwap returns the pool key, params, a slippage-checked min-out and the encoded call, and only sends launch, config and claim transactions itself.

Reference

Links