Hoodit Docs

Everything a human — or an AI agent — needs to trade, quote, LP and launch markets on Hoodit.xyz, the #1 DLMM (Dynamic Liquidity Market Maker) exchange on Robinhood Chain. Machine-readable summary: /llms.txt.

What is a DLMM?

A Dynamic Liquidity Market Maker organizes liquidity into discrete price bins(a “liquidity book”). Trades inside a bin execute at that bin's exact price — zero slippage within the bin. Crossing bins moves the price one step at a time.

Fees are dynamic: a base fee (set by the pool's bin step) plus a variable fee that grows with realized volatility — the faster the market moves, the more liquidity providers earn. Hoodit is a Liquidity Book v2.2 deployment (Trader Joe / LFJ lineage, MIT), verified on Blockscout.

LP positions are LBToken shares per bin (ERC-1155-style). Single-sided deposits work as limit orders that earn fees while they wait to fill.

Chain & Contracts

ChainRobinhood Chain — id 4663
Public RPChttps://rpc.mainnet.chain.robinhood.com

All contracts are verified on Blockscout — full ABIs are on each address page. Router paths use version = 3(V2_2). Every pool is paired against WETH; the router's NATIVE methods wrap/unwrap ETH for you.

Fee Tiers (bin steps)

The bin step is the price gap between adjacent bins in basis points — it is also the base fee. Open presets anyone can create pools with:

Bin stepBase feeIntended for
100.10%majors / correlated pairs
250.25%mid-caps, stock tokens
500.50%volatile pairs
1001.00%meme pairs
2002.00%hyper-volatile, wide bins
5005.00%extreme moves, widest bins

On top of the base fee, a variable fee accrues with volatility (capped so total fee stays below 10%). 25% of all swap fees are protocol share; the remaining 75% goes to liquidity providers in the bins that traded.

REST API (indexer)

Free, no auth, CORS-open. Base URL: https://indexer-production-8705.up.railway.app

GET /healthindexer status + last indexed block
GET /statsprotocol totals: TVL, 24h volume, 24h fees, pair count
GET /poolsall pools with reserves, TVL, 24h volume/fees, fee APR
GET /pools/:pairone pool incl. recent swaps
GET /pools/:pair/bins?range=40per-bin liquidity around the active bin
GET /pools/:pair/candles?tf=5m&limit=300OHLCV — tf: 1m, 5m, 1h, 1d
GET /positions/:walleta wallet's LP positions across all pools
curl https://indexer-production-8705.up.railway.app/pools
curl https://indexer-production-8705.up.railway.app/pools/0x83De75e1794861F1D5d1943F9aC9FE269B500da9/bins?range=40

Swapping (viem)

1) quote with LBQuoter, 2) swap through LBRouter. Path versions are 3 (V2_2) for every Hoodit pool.

import { createWalletClient, createPublicClient, http, parseEther, parseAbi } from "viem";

const chain = {
  id: 4663, name: "Robinhood Chain",
  nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
  rpcUrls: { default: { http: ["https://rpc.mainnet.chain.robinhood.com"] } },
};

const quoterAbi = parseAbi([
  "struct Quote { address[] route; address[] pairs; uint256[] binSteps; uint128[] amounts; uint128[] virtualAmountsWithoutSlippage; uint128[] fees; }",
  // versions omitted in this trimmed struct on some ABIs — use the Blockscout ABI in production
  "function findBestPathFromAmountIn(address[] route, uint128 amountIn) view returns (Quote)",
]);
const routerAbi = parseAbi([
  "function swapExactNATIVEForTokens(uint256 amountOutMin, (uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address to, uint256 deadline) payable returns (uint256)",
  "function swapExactTokensForNATIVE(uint256 amountIn, uint256 amountOutMinNATIVE, (uint256[] pairBinSteps, uint8[] versions, address[] tokenPath) path, address to, uint256 deadline) returns (uint256)",
]);

const WETH = "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73";
const TOKEN = "0x…";           // token you're buying
const pub = createPublicClient({ chain, transport: http() });

// quote ETH -> TOKEN
const q = await pub.readContract({
  address: "0x5da71dF26891932B59a80588dAf8c13DfB1C684a", abi: quoterAbi,
  functionName: "findBestPathFromAmountIn",
  args: [[WETH, TOKEN], parseEther("0.01")],
});
const amountOut = q.amounts[q.amounts.length - 1];

// swap with 1% slippage
await wallet.writeContract({
  address: "0x138D1111bE8957E3FEbC126385034bdb84B1f93B", abi: routerAbi,
  functionName: "swapExactNATIVEForTokens",
  args: [
    (amountOut * 99n) / 100n,
    { pairBinSteps: q.binSteps, versions: q.binSteps.map(() => 3), tokenPath: [WETH, TOKEN] },
    me, BigInt(Math.floor(Date.now() / 1000) + 300),
  ],
  value: parseEther("0.01"),
});

Providing Liquidity

Deposits target bins relative to the active bin via deltaIds with per-bin distributionX/Y weights that each sum to 1e18. Token X fills bins above the active price, token Y (WETH) below. Common shapes: uniform (“spot”), gaussian around price (“curve”), or edge-weighted (“bid-ask”).

// addLiquidityNATIVE — 5 bins centered on the active bin, uniform shape
const n = 5, deltaIds = [-2, -1, 0, 1, 2];
const w = 10n ** 18n / BigInt(n);
const params = {
  tokenX: TOKEN, tokenY: WETH, binStep: 100n,
  amountX, amountY,
  amountXMin: amountX * 99n / 100n, amountYMin: amountY * 99n / 100n,
  activeIdDesired: BigInt(activeId), idSlippage: 5n,
  deltaIds,
  distributionX: deltaIds.map(d => (d >= 0 ? w : 0n)),  // X above/at price
  distributionY: deltaIds.map(d => (d <= 0 ? w : 0n)),  // Y at/below price
  to: me, refundTo: me,
  deadline: BigInt(Math.floor(Date.now() / 1000) + 300),
};
await wallet.writeContract({
  address: "0x138D1111bE8957E3FEbC126385034bdb84B1f93B", abi: routerAbi,
  functionName: "addLiquidityNATIVE", args: [params], value: amountY,
});
// withdraw: approveForAll(router) on the pair, then removeLiquidityNATIVE
// with your bin ids + LBToken share amounts (balanceOfBatch for live values).

Get activeId from GET /pools/:pair/bins or the pair's getActiveId(). A single-sided deposit (only X above price, or only Y below) is a fee-earning limit order.

Creating a Pool

Permissionless for the open bin steps (10, 25, 50, 100, 200, 500). Price is encoded as a bin id: id = 8388608 + log(price) / log(1 + binStep/10000) (price in tokenY-per-tokenX, decimals adjusted).

await wallet.writeContract({
  address: "0x22602d966DeFd638ee94E97A92e2Eb0934c3fE1B",
  abi: parseAbi(["function createLBPair(address tokenX, address tokenY, uint24 activeId, uint16 binStep) returns (address)"]),
  functionName: "createLBPair",
  args: [TOKEN, "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73", activeId, 100],
});

Or just use the /create page — it resolves the bin id from a human price for you.

Notes for AI Agents

  • Machine-readable index at hoodit.xyz/llms.txt; this page is the canonical integration reference.
  • Discover markets via GET https://indexer-production-8705.up.railway.app/pools — no key, no rate card; be polite (≤1 req/s sustained).
  • All pools quote against WETH (0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73). Prices from the API are human-adjusted floats; on-chain prices are 128.128 fixed point.
  • Always quote first (LBQuoter), apply slippage bounds, and set a deadline. Router version code for Hoodit pools is 3.
  • Verify you are on chain id 4663 before signing. Contract source is verified on Blockscout — fetch ABIs from https://robinhoodchain.blockscout.com/api.