All skills
uniswap avatar

/liquidity-planner

@5201809
by Uniswap Labsuniswap/uniswap-ai233 stars
39

This skill should be used when the user asks to "provide liquidity", "create LP position", "add liquidity to pool", "become a liquidity provider", "create v3 position", "create v4 position", "concentrated liquidity", "set price range", or mentions providing liquidity, LP positions, or liquidity pools on Uniswap. Generates deep links to create positions in the Uniswap interface.

Use this Skill: https://skilld.dev/gh/uniswap/uniswap-ai/liquidity-planner

This session only. Nothing lands on disk.

referencesdata-providers.md

≈1.8k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Data Providers Reference

APIs for fetching pool data to inform LP position decisions. Uses two providers:

  1. DexScreener - Pool discovery, prices, TVL, volume (primary)
  2. DefiLlama - APY/yield data (when available)

DexScreener API (Primary)

No authentication required. 300 requests/minute. Best for pool discovery and real-time metrics.

Network IDs: ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, unichain

Discover Pools for a Token

Use this to find what pools exist for a token pair:

# Find all pools containing a token (e.g., UNI on Base)
curl -s "https://api.dexscreener.com/token-pairs/v1/base/0xc3de830ea07524a0761646a6a4e4be0e114a3c83" | \
  jq '[.[] | select(.dexId == "uniswap")] | map({
    pairAddress,
    baseToken: .baseToken.symbol,
    quoteToken: .quoteToken.symbol,
    version: .labels[0],
    liquidity: .liquidity.usd,
    volume24h: .volume.h24,
    priceUsd
  })'

Get Pool Details

# Get specific pool by address
curl -s "https://api.dexscreener.com/latest/dex/pairs/base/0xab365f161dd501473a1ff0d2ef0dce94e7398839" | \
  jq '.pairs[0] | {
    name: "\(.baseToken.symbol)/\(.quoteToken.symbol)",
    version: .labels[0],
    liquidity: .liquidity.usd,
    volume24h: .volume.h24,
    baseTokenPrice: .baseToken.priceUsd,
    quoteTokenPrice: .quoteToken.priceUsd,
    priceChange24h: .priceChange.h24
  }'

Search for Token Pair

# Search by token names (filter results by dexId)
curl -s "https://api.dexscreener.com/latest/dex/search?q=ETH%20USDC%20base" | \
  jq '[.pairs[] | select(.dexId == "uniswap")] | .[0:5] | map({
    pairAddress,
    name: "\(.baseToken.symbol)/\(.quoteToken.symbol)",
    liquidity: .liquidity.usd,
    volume24h: .volume.h24
  })'

DexScreener Response Fields

Field Path Description
Pool address pairAddress Use for deep links
Version labels[0] "v3" or "v4"
TVL liquidity.usd Pool liquidity in USD
24h Volume volume.h24 Trading volume
Price priceUsd Current price
Base token price baseToken.priceUsd For ratio calculations
Quote token price quoteToken.priceUsd For ratio calculations

Important Notes

  • Filter by DEX: Results include ALL DEXes. Always filter with select(.dexId == "uniswap").
  • Fee tier not explicit: DexScreener shows version (v3/v4) but not fee tier (0.3%, 1%). Each fee tier has a different pool address - multiple pools for same pair = different fee tiers.
  • No 7d volume: Only real-time data up to 24 hours.

DefiLlama Yields API (APY Data)

No authentication required. Best source for Uniswap pool yields, but coverage is limited for less popular pairs.

Find Pool APY

# Find Uniswap V3 pools for a token pair on a specific chain
curl -s "https://yields.llama.fi/pools" | jq '[.data[] | select(
  .project == "uniswap-v3" and
  .chain == "Base" and
  (.symbol | test("WETH.*UNI|UNI.*WETH"; "i"))
)] | map({symbol, apy, apyBase, tvlUsd, volumeUsd1d, volumeUsd7d})'

DefiLlama Response Fields

Field Description
apy Total APY (base + rewards)
apyBase APY from trading fees only
tvlUsd Total value locked
volumeUsd1d 24-hour volume
volumeUsd7d 7-day volume

Chain Names

DefiLlama uses capitalized names: Ethereum, Base, Arbitrum, Optimism, Polygon

Coverage Limitations

DefiLlama often returns empty results for:

  • Less popular token pairs
  • Newer pools
  • Low-TVL pools

When empty, note "APY data unavailable" and rely on DexScreener for other metrics.

Recommended Workflow

Step 1: Discover Pools (DexScreener)

# Find all Uniswap pools for the token
curl -s "https://api.dexscreener.com/token-pairs/v1/{network}/{token_address}" | \
  jq '[.[] | select(.dexId == "uniswap")]'

From results, identify:

  • Available pools and their addresses
  • Which has highest liquidity (likely the main fee tier)
  • Current prices for range calculations

Step 2: Check APY (DefiLlama)

# Try to get yield data
curl -s "https://yields.llama.fi/pools" | jq '[.data[] | select(
  .project == "uniswap-v3" and
  .chain == "{Chain}" and
  (.symbol | test("{TOKEN_A}.*{TOKEN_B}|{TOKEN_B}.*{TOKEN_A}"; "i"))
)]'

If results empty, proceed without APY data.

Step 3: Assess Liquidity

TVL Range Assessment Action
> $1M Deep liquidity Proceed normally
$100K - $1M Moderate Suitable for most positions
$10K - $100K Thin Warn user, suggest wider ranges
< $10K Very thin Strong warning about risks

Step 4: Calculate Price Range

Use DexScreener prices to calculate range bounds:

# Get current price ratio
BASE_PRICE=$(curl -s "..." | jq -r '.pairs[0].baseToken.priceUsd')
QUOTE_PRICE=$(curl -s "..." | jq -r '.pairs[0].quoteToken.priceUsd')

# Calculate ratio and ±20% bounds with python
python3 -c "
base, quote = $BASE_PRICE, $QUOTE_PRICE
ratio = quote / base
print(f'Current: {ratio:.2f}')
print(f'Min (−20%): {ratio * 0.8:.2f}')
print(f'Max (+20%): {ratio * 1.2:.2f}')
"

Example: Complete Pool Research

# 1. Find ETH/UNI pools on Base
curl -s "https://api.dexscreener.com/token-pairs/v1/base/0xc3de830ea07524a0761646a6a4e4be0e114a3c83" | \
  jq '[.[] | select(.dexId == "uniswap" and (.quoteToken.symbol == "WETH" or .baseToken.symbol == "WETH"))] | map({
    pairAddress,
    pair: "\(.baseToken.symbol)/\(.quoteToken.symbol)",
    version: .labels[0],
    tvl: .liquidity.usd,
    volume24h: .volume.h24,
    ethPrice: (if .quoteToken.symbol == "WETH" then .quoteToken.priceUsd else .baseToken.priceUsd end),
    uniPrice: (if .baseToken.symbol == "UNI" then .baseToken.priceUsd else .quoteToken.priceUsd end)
  })'

# 2. Try DefiLlama for APY (may return empty)
curl -s "https://yields.llama.fi/pools" | jq '[.data[] | select(
  .project == "uniswap-v3" and
  .chain == "Base" and
  (.symbol | test("UNI.*WETH|WETH.*UNI|UNI.*ETH|ETH.*UNI"; "i"))
)] | map({symbol, apy, tvlUsd})'

Error Handling

Scenario Action
DexScreener returns no Uniswap pools Pool may not exist; inform user they'd create a new pool
DefiLlama returns empty Note "APY unavailable"; use DexScreener volume/TVL ratio as proxy
Multiple pools found Present options; highest TVL is usually the primary fee tier
API timeout Retry once, then fall back to web search

Source: SKILL.md on GitHub

1 warning16d4 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides a safe workflow for planning and setting up liquidity positions on Uniswap. It operates entirely via deep links, query string preparation, and read-only data calls, implementing strict input validation rules prior to script execution.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: MEDIUM · 1 issue

  • Runlayer6mo

    2/3 files flagged

Signed by skilld at 5201809. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 2 months ago
What it can do
Reads files Runs commands Network
Modelsonnet
model
sonnet
metadata
{
  "author": "uniswap",
  "version": "0.2.0"
}
All 12 allowed tools
ReadGlobGrepBash(curl:*)Bash(jq:*)Bash(cast:*)Bash(xdg-open:*)Bash(open:*)WebFetchWebSearchTask(subagent_type:Explore)AskUserQuestion

README badge

README badge for uniswap/uniswap-ai/liquidity-planner