К основному содержанию
скилл CX Codex

swap-planner — скилл для Claude Code: планирует свопы в Uniswap

Собирает параметры свопа, проверяет контракты токенов и выдаёт ссылку, которая открывает Uniswap с уже заполненными полями.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Uniswap/uniswap-ai --skill swap-planner -a claude-code
Открыть на GitHub

Что делает swap-planner

Скилл ведёт диалог: спрашивает токены, сумму и сеть, проверяет адреса контрактов через cast и curl, а затем формирует deep link в интерфейс Uniswap. Ссылку можно скопировать и открыть вручную — в SSH, контейнере или headless-окружении автозапуск браузера через xdg-open/open не сработает.

Отдельная ветка — поиск токенов. Живой ленты «трендов» у DexScreener нет, поэтому discovery идёт по ключевым словам через /latest/dex/search или через веб-поиск с последующей проверкой. Покрытие DexScreener различается по сетям: на Ethereum, Base и Arbitrum данных по пулам Uniswap много, а на Celo, Blast, Zora и World Chain — мало, и часть пар просто не найдётся. Тогда скилл советует перейти на DefiLlama за ценой.

Токены, найденные веб-поиском, помечаются как недоверенные. Скилл обязан предупредить о риске скама, ханнипота или rug pull и запросить подтверждение через AskUserQuestion до генерации ссылки. Если контракту меньше 7 дней, предупреждение обязательно. В средах без AskUserQuestion те же параметры собираются обычным разговором. Доступ к файлам — только чтение и только внутри текущего проекта.

Какие задачи решает

  • собрать ссылку на своп ETH в USDC с готовыми параметрами
  • проверить адрес токена из веб-поиска перед сделкой
  • найти токены по ключевому слову в конкретной сети
  • отсеять свежие контракты с высоким риском
  • получить цену и ликвидность пары, когда DexScreener пуст

Примеры запросов агенту

  • хочу обменять ETH на USDC в сети Base
  • найди мемкоины на Base и покажи ликвидность
  • проверь этот адрес токена и собери ссылку на своп

Как установить swap-planner

1Через Skills CLI (Vercel)

npx skills add Uniswap/uniswap-ai --skill swap-planner -a claude-code

2Вручную: положить файлы

~/.claude/skills/swap-planner/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/swap-planner/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора11

swap-integration Помогает настроить обмен токенов через Uniswap в веб-интерфейсах, бэкенд-скриптах и смарт-контрактах. Пригодится при работе с Trading API или Universal Router. CX Codex +1 2 200установок v4-security-foundations Разбирает угрозы хуков Uniswap v4 до того, как вы напишете код: проверка вызывающего, флаги разрешений, дельта-учёт. Пригодится при работе с beforeSwap и PoolManager. CX Codex +1 1 200установок liquidity-planner Помогает спланировать LP-позицию на Uniswap v2, v3 или v4 и создаёт прямую ссылку с заполненными параметрами для интерфейса биржи. CX Codex +1 1 200установок configurator Скилл проводит по анкете параметров CCA-аукциона: сеть, токен, сроки, цены. Пригодится, когда нужно собрать конфиг для деплоя без ручного перебора полей. CX Codex +1 1 100установок deployer Разворачивает смарт-контракты аукционов Continuous Clearing Auction (CCA) через фабрику CREATE2 и проверяет параметры перед отправкой транзакций. CX Codex +1 1 100установок pay-with-any-token Оплачивает ответы HTTP 402 и вызовы machine payment protocol через Tempo CLI. Пополняет кошелёк обменом токенов из других EVM-сетей через Uniswap Trading API. CX Codex +1 815установок v4-sdk-integration Скилл ведёт агента по Uniswap v4 SDK: сборка свапов через Universal Router, котировки, чтение состояния пула и работа с LP-позициями. CX Codex +1 729установок v4-hook-generator Скилл собирает контракты хуков Uniswap v4 через MCP-инструмент OpenZeppelin Contracts Wizard: выбор типа хука, права, библиотеки, готовый Solidity. CX Codex +1 686установок

Похожие

aicoin-onchain aicoincom Скилл для ончейн-торговли: считает котировки свопов, показывает баланс кошелька и оценивает газ. Пригодится, когда агент должен работать с DEX, а не с биржей. CX Codex +1 302установок swap-tokens circlefin Скилл для сборки свопов токенов в браузере и на сервере через Circle App Kit или Swap Kit. Пригодится, если нужен обмен USDT на USDC или кроссчейн-маршрут. CX Codex +1 848установок emblem-defi-yield EmblemAI Скилл для исследования доходности в DeFi, проверки позиций через Nansen и входа в ликвидный стейкинг свопами на Solana, Ethereum, Base, BSC, Polygon и Hedera. CX Codex +1 8 700установок binance-agentic-wallet binance-web3-team Скилл подключает консольный интерфейс кошелька Binance к агенту, позволяя проверять баланс, совершать переводы, торговать на бирже и управлять DeFi-операциями прямо из терминала. CX Codex +1 16 700установок gmgn-swap GMGNAI Скилл отправляет сделки с токенами через GMGN API: свапы, продажи, ордера и операции с несколькими кошельками. CX Codex +1 17 000установок swap-curve-strategy официальный anthropics Скилл для анализа кривой процентных свопов: строит своп-спреды, вычисляет реальные ставки и подбирает сделки вроде стипенеров или бабочек с расчётом DV01. CX Codex +1 1 700установок

Рядом в теме «Настройка агента: память, контекст, субагенты»

Все скиллы по теме «Настройка агента: память, контекст, субагенты» →

Вопросы о swap-planner

Как установить swap-planner в Claude?

Выполните npx skills add Uniswap/uniswap-ai --skill swap-planner -a claude-code. Скилл окажется в ~/.claude/skills/swap-planner/SKILL.md.

Что делает swap-planner?

Собирает параметры свопа, проверяет контракты токенов и генерирует deep link, который открывает Uniswap с заполненными полями. Умеет и искать токены по ключевым словам.

Как скилл обходится с токенами из веб-поиска?

Помечает их как недоверенные, предупреждает о риске скама и требует явного подтверждения до генерации ссылки. В таблице итогов видно, откуда взялся каждый токен.

Исходный текст

SKILL.md · MIT
---
name: swap-planner
description: This skill should be used when the user asks to "swap tokens", "trade ETH for USDC", "exchange tokens on Uniswap", "buy tokens", "sell tokens", "convert ETH to stablecoins", "find memecoins", "discover tokens", "research tokens", "tokens to buy", "find tokens to swap", "what should I buy", or mentions swapping, trading, researching, discovering, buying, or exchanging tokens on any Uniswap-supported chain. Supports both known token swaps and token discovery workflows (discovery uses keyword search and web search — there is no live "trending" feed). Generates deep links to execute swaps in the Uniswap interface.
allowed-tools: Read, Glob, Grep, Bash(curl:*), Bash(jq:*), Bash(cast:*), Bash(xdg-open:*), Bash(open:*), WebFetch, WebSearch, Task(subagent_type:Explore), AskUserQuestion
model: sonnet
license: MIT
metadata:
  author: uniswap
  version: '0.2.1'
---

# Swap Planning

Plan and generate deep links for token swaps on Uniswap across all supported chains.

> **Runtime Compatibility:** This skill uses `AskUserQuestion` for interactive prompts. If `AskUserQuestion` is not available in your runtime, collect the same parameters through natural language conversation instead.

## Overview

Plan token swaps by:

1. Gathering swap intent (tokens, amounts, chain)
2. Verifying token contracts on-chain
3. Researching tokens via web search when needed
4. Generating a deep link that opens in the Uniswap interface with parameters pre-filled

The generated link opens Uniswap with all parameters ready for execution.

> **Note:** Browser opening (`xdg-open`/`open`) may fail in SSH, containerized, or headless environments. Always display the URL prominently so users can copy and access it manually if needed.

<!-- markdownlint-disable-next-line MD028 -->

> **File Access:** This skill has read-only filesystem access. Never read files outside the current project directory unless explicitly requested by the user.

## Workflow

### Step 0: Token Discovery (When Needed)

If the user wants to **discover** tokens rather than swap a known token (e.g., "find me a memecoin", "what's trending on Base"), help them explore before proceeding to the swap.

#### Option A: Search by Keyword

DexScreener search works best with specific terms:

```bash
# Search for tokens by name/category (e.g., "degen", "pepe", "ai agent")
curl -s "https://api.dexscreener.com/latest/dex/search?q=degen" | \
  jq '[.pairs[] | select(.chainId == "base" and .dexId == "uniswap")] |
    sort_by(-.volume.h24) | .[0:5] | map({
      token: .baseToken.symbol,
      address: .baseToken.address,
      price: .priceUsd,
      volume24h: .volume.h24,
      liquidity: .liquidity.usd
    })'
```

**Good search terms:** `degen`, `pepe`, `ai`, `agent`, `meme`, `dog`, `cat`, or specific token names

#### Option B: Check Promoted Tokens

Get tokens with active promotions (limited selection):

```bash
# Get boosted/promoted tokens on a chain
curl -s "https://api.dexscreener.com/token-boosts/top/v1" | \
  jq '[.[] | select(.chainId == "base")] | .[0:5] | map({
    tokenAddress,
    url
  })'
```

#### Option C: Web Search + Verify

For broad discovery ("what's trending"), use web search to find tokens, then verify with DexScreener:

```bash
# After finding a token address from web search, verify it exists
curl -s "https://api.dexscreener.com/token-pairs/v1/{network}/{address}" | \
  jq '[.[] | select(.dexId == "uniswap")][0] | {
    name: .baseToken.name,
    symbol: .baseToken.symbol,
    price: .priceUsd,
    liquidity: .liquidity.usd,
    volume24h: .volume.h24
  }'
```

**Network IDs:** See `references/chains.md` for the full list with DexScreener and DefiLlama provider IDs. Common IDs: `ethereum`, `base`, `arbitrum`, `optimism`, `polygon`, `bsc`, `avalanche`, `unichain`.

**DexScreener coverage varies by chain.** Ethereum, Base, and Arbitrum have deep Uniswap data. Celo, Blast, Zora, and World Chain have limited Uniswap pool coverage — fewer results and potentially missing pairs. Fall back to DefiLlama for price data when DexScreener returns empty results (see `references/data-providers.md`).

**Note:** DexScreener's public API doesn't have a "trending" or "top gainers" endpoint. Token discovery uses keyword search (`/latest/dex/search`) and web search as a fallback. For general discovery, ask the user what type of token they're looking for and search by keyword.

#### Category-Based Discovery

For specific categories (memecoins, DeFi, gaming tokens), use web search:

```text
"trending {category} {chain} {current_year}"
```

Example: `"trending memecoins Base 2026"`

#### ⚠️ UNTRUSTED INPUT: Web-Discovered Tokens

Tokens discovered via WebSearch are **UNTRUSTED**. Before proceeding with any web-discovered token:

1. **Label the source**: Explicitly tell the user "This token address was found via web search, not provided by you"
2. **Warn about risks**: "Web-discovered tokens may be scams, honeypots, or rug pulls"
3. **Require confirmation**: Use AskUserQuestion to get explicit user consent before generating a deep link for a web-discovered token
4. **Show provenance**: In the swap summary table, include a "Token Source" row showing whether each token was "User-provided" or "Web-discovered (unverified)"

**Never proceed with a web-discovered token without explicit user confirmation — via AskUserQuestion, or an equivalent conversational confirmation where that tool is unavailable.**

#### Present Options to User

After gathering token data, present options using AskUserQuestion:

```json
{
  "questions": [
    {
      "question": "Which token would you like to swap to?",
      "header": "Token",
      "options": [
        { "label": "MOLT ($23M mcap)", "description": "$5.9M liquidity, $7.8M 24h volume" },
        { "label": "CLANKER ($31M mcap)", "description": "$3.1M liquidity, established token" },
        { "label": "CLAWSTR ($13M mcap)", "description": "$2.1M liquidity, high volume spike" }
      ],
      "multiSelect": false
    }
  ]
}
```

#### Risk Assessment for Trending Tokens

Evaluate tokens before recommending:

| Metric       | Low Risk   | Medium Risk       | High Risk |
| ------------ | ---------- | ----------------- | --------- |
| Market Cap   | >$50M      | $5M-$50M          | <$5M      |
| Pool TVL     | >$1M       | $100k-$1M         | <$100k    |
| 24h Volume   | Consistent | Spiking unusually | Very low  |
| Contract Age | >30 days   | 7-30 days         | <7 days   |

**Always disclose risk level** when presenting options. For high-risk tokens, explicitly warn about volatility and potential for loss.

#### Mandatory Warnings for High-Risk Tokens

When ANY of these conditions are met, you MUST warn the user and get explicit confirmation before generating a deep link (via AskUserQuestion where available, conversational confirmation otherwise):

- **Contract age < 7 days**: "This token contract is less than 7 days old. New tokens carry significantly higher risk of being scams or rug pulls."
- **Pool TVL < $100k**: "This pool has very low liquidity. You may experience significant slippage and difficulty selling."
- **No sell liquidity detected**: "This token may be a honeypot — tokens that can be bought but not sold. Proceed with extreme caution."
- **Market cap < $5M**: "This is a micro-cap token with high volatility. Only invest what you can afford to lose entirely."

Do NOT generate a deep link for high-risk tokens without explicit user acknowledgment.

---

### Step 1: Gather Swap Intent

Extract from the user's request:

| Parameter    | Required                | Example                   |
| ------------ | ----------------------- | ------------------------- |
| Input token  | Yes                     | ETH, USDC, token address  |
| Output token | Yes                     | USDC, WBTC, token address |
| Amount       | Yes                     | 1.5 ETH, $500 worth       |
| Chain        | Yes (default: Ethereum) | Base, Arbitrum, etc.      |

**If any required parameter is missing, use AskUserQuestion with structured options:**

For missing chain:

```json
{
  "questions": [
    {
      "question": "Which chain do you want to swap on?",
      "header": "Chain",
      "options": [
        { "label": "Base (Recommended)", "description": "Low gas fees, fast transactions" },
        { "label": "Ethereum", "description": "Main network, higher gas" },
        { "label": "Arbitrum", "description": "Low fees, Ethereum L2" },
        { "label": "Optimism", "description": "Low fees, Ethereum L2" }
      ],
      "multiSelect": false
    }
  ]
}
```

For missing output token (when input is ETH):

```json
{
  "questions": [
    {
      "question": "What token do you want to receive?",
      "header": "Output",
      "options": [
        { "label": "USDC", "description": "USD stablecoin" },
        { "label": "USDT", "description": "Tether stablecoin" },
        { "label": "DAI", "description": "Decentralized stablecoin" },
        { "label": "WBTC", "description": "Wrapped Bitcoin" }
      ],
      "multiSelect": false
    }
  ]
}
```

For missing amount:

```json
{
  "questions": [
    {
      "question": "How much do you want to swap?",
      "header": "Amount",
      "options": [
        { "label": "0.1 ETH", "description": "~$320" },
        { "label": "0.5 ETH", "description": "~$1,600" },
        { "label": "1 ETH", "description": "~$3,200" },
        { "label": "Custom amount", "description": "Enter specific amount" }
      ],
      "multiSelect": false
    }
  ]
}
```

Always use forms instead of plain text questions for better UX.

### Step 2: Resolve Token Addresses

For token symbols, resolve to addresses using known tokens or web search:

**Native tokens**: Use `NATIVE` as the address parameter.

**Common tokens by chain** - see `../../references/chains.md` for full list:

| Token | Ethereum                                     | Base                                         | Arbitrum                                     |
| ----- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- |
| USDC  | `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | `0xaf88d065e77c8cC2239327C5EDb3A432268e5831` |
| WETH  | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` | `0x4200000000000000000000000000000000000006` | `0x82aF49447D8a07e3bd95BD0d56f35241523fBab1` |
| WBTC  | `0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599` | N/A                                          | `0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f` |

For unknown tokens, use web search to find the contract address, then verify on-chain.

### Step 3: Verify Token Contracts (Basic)

**Input Validation (Required Before Any Shell Command):**

Before interpolating user-provided values into any shell command, validate all inputs:

- **Token addresses** MUST match: `^0x[a-fA-F0-9]{40}$`
- **Chain/network names** MUST be from the allowed list in `../../references/chains.md`
- **Amounts** MUST be valid decimal numbers (match: `^[0-9]+\.?[0-9]*$`)
- **Reject** any input containing shell metacharacters (`;`, `|`, `$`, `` ` ``, `&`, `(`, `)`, `>`, `<`, `\`, `'`, `"`, newlines)

Verify token contracts exist on-chain using curl (RPC call):

```bash
# Check if address is a contract using eth_getCode
# IMPORTANT: Validate token_address matches ^0x[a-fA-F0-9]{40}$ before use
curl -s -X POST "$rpc_url" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg addr "$token_address" '{"jsonrpc":"2.0","method":"eth_getCode","params":[$addr,"latest"],"id":1}')" \
  | jq -r '.result'
```

If the result is `0x` or empty, the address is not a valid contract.

**Alternative with cast** (optional, requires [Foundry](https://book.getfoundry.sh/)):

```bash
# Validate token_address matches ^0x[a-fA-F0-9]{40}$ before use
cast code "$token_address" --rpc-url "$rpc_url"
```

**Note:** The curl/RPC method above is preferred for broader compatibility. Only use `cast` if already available in the environment. This skill ONLY uses `cast code` for contract verification. Do not use any other cast subcommands. The PreToolUse hook in `.claude/hooks/validate-forge-cast.sh` enforces this programmatically.

**RPC URLs by chain** - see `../../references/chains.md` for full list.

### Step 4: Research (If Needed)

For unfamiliar tokens, use web search to research:

- Token legitimacy and project info
- Recent news or security concerns
- Liquidity availability on Uniswap

Include relevant findings in the summary.

### Step 5: Fetch Price Data

Before generating the deep link, fetch current prices to estimate swap output. See `references/data-providers.md` for full API details.

**Quick price lookup with DexScreener:**

```bash
# Get token price and pool liquidity
curl -s "https://api.dexscreener.com/token-pairs/v1/{network}/{address}" | \
  jq '[.[] | select(.dexId == "uniswap")][0] | {
    price: .priceUsd,
    liquidity: .liquidity.usd,
    volume24h: .volume.h24
  }'
```

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

**Liquidity warnings:**

| Pool TVL    | Risk Level | Action                        |
| ----------- | ---------- | ----------------------------- |
| > $1M       | Low        | Proceed normally              |
| $100k - $1M | Medium     | Note potential slippage       |
| < $100k     | High       | Warn user about slippage risk |

If API is unavailable, fall back to DefiLlama or web search for price estimates.

### Step 6: Generate Deep Link

Construct the Uniswap swap URL:

```text
https://app.uniswap.org/swap?chain={chain}&inputCurrency={input}&outputCurrency={output}&value={amount}&field=INPUT
```

**URL Parameters:**

| Parameter        | Description                  | Values                                                                                                                       |
| ---------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `chain`          | Network name                 | `ethereum`, `base`, `arbitrum`, `optimism`, `polygon`, `bnb`, `avalanche`, `celo`, `blast`, `zora`, `unichain`, `worldchain` |
| `inputCurrency`  | Input token                  | Address or `NATIVE`                                                                                                          |
| `outputCurrency` | Output token                 | Address or `NATIVE`                                                                                                          |
| `value`          | Amount                       | Decimal number (e.g., `1.5`)                                                                                                 |
| `field`          | Which field value applies to | `INPUT` or `OUTPUT`                                                                                                          |

### Step 7: Present Output and Open Browser

Format the response with:

1. **Summary** of the swap parameters
2. **Deep link** URL (displayed for reference)
3. **Notes** about risks or considerations
4. **Open the browser** automatically using system command

**Example output format:**

```markdown
## Swap Summary

| Parameter        | Value                      |
| ---------------- | -------------------------- |
| From             | 1 ETH                      |
| To               | USDC                       |
| Chain            | Base                       |
| Current Rate     | ~3,200 USDC per ETH        |
| Estimated Output | ~3,200 USDC                |
| Pool Liquidity   | $15.2M (Low slippage risk) |

### Notes

- Final amount depends on current market price
- Default slippage is 0.5% - adjust in Uniswap if needed
- Review all details in Uniswap before confirming

Opening Uniswap in your browser...
```

**After displaying the summary, open the URL in the browser:**

```bash
# Linux
xdg-open "https://app.uniswap.org/swap?chain=base&inputCurrency=NATIVE&outputCurrency=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&value=1&field=INPUT"

# macOS
open "https://app.uniswap.org/swap?..."
```

**Environment limitations:** Browser opening may fail in remote SSH, containerized, or headless environments. If `xdg-open`/`open` fails, display the full URL prominently so users can copy and paste it manually:

```markdown
**[Click here to open in Uniswap](https://app.uniswap.org/swap?...)**

Or copy this URL: `https://app.uniswap.org/swap?...`
```

Always present the summary and URL so users can review and execute.

## Important Considerations

### Slippage

The deep link uses Uniswap's default slippage (0.5%). For volatile tokens or large trades, advise users to adjust slippage in the interface.

### Gas Estimation

Gas costs vary by chain and network congestion. Base and Arbitrum typically have lower gas than Ethereum mainnet.

### Token Verification

Always verify token contracts before generating links. Scam tokens often use similar names to legitimate tokens.

### Price Impact

For large trades, warn users about potential price impact. Suggest splitting into smaller trades if impact would be significant.

## Supported Chains

All chains supported by the Uniswap interface:

- Ethereum Mainnet (`ethereum`)
- Base (`base`)
- Arbitrum One (`arbitrum`)
- Optimism (`optimism`)
- Polygon (`polygon`)
- BNB Chain (`bnb`)
- Avalanche (`avalanche`)
- Celo (`celo`)
- Blast (`blast`)
- Zora (`zora`)
- World Chain (`worldchain`)
- Unichain (`unichain`)

## Additional Resources

### Reference Files

- **`../../references/chains.md`** - Chain IDs, RPC URLs, native tokens, common token addresses
- **`references/data-providers.md`** - DexScreener and DefiLlama APIs for prices and liquidity

### Examples

Common swap scenarios:

- ETH → USDC on Ethereum
- ETH → USDC on Base (lower gas)
- USDC → WBTC on Arbitrum

© uniswap · MIT · Uniswap/uniswap-ai

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой