swap-planner について
swap-plannerは、Uniswapのトークンスワップを計画し、入力済みリンクを作成するスキルです。条件の収集やコントラクト・市場データの確認を行い、発見したトークンや高リスクのトークンには確認手順を設けます。
主な機能
- 01トークン・数量・チェーンの収集
- 02トークンコントラクトの検索と検証
- 03トークンと価格データの調査
- 04入力済みUniswapスワップリンクの作成
- 05リスク警告と確認手順
活用シーン
- 01既知のトークンペアのスワップリンク作成
- 02スワップ先を決める前のトークン探索
- 03取引前のコントラクトと流動性リスク確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ uniswap/ uniswap-ai --skill swap-plannerインストール後、Claude Code で/swap-plannerを入力して読み込まれたか確認します。
同梱ファイルreferences/data-providers.md
詳細
スワップの計画
サポート対象のすべてのチェーンで、Uniswap でのトークンスワップを計画し、ディープリンクを生成します。
ランタイムの互換性: このスキルでは、対話形式のプロンプトに
AskUserQuestionを使用します。実行環境でAskUserQuestionを利用できない場合は、自然な会話を通じて同じパラメーターを収集してください。
概要
以下の手順でトークンスワップを計画します。
- スワップの意図を確認する(トークン、数量、チェーン)
- トークンコントラクトをオンチェーンで検証する
- 必要に応じてウェブ検索でトークンを調査する
- パラメーターが事前入力された状態で Uniswap のインターフェースを開くディープリンクを生成する
生成されたリンクを開くと、すべてのパラメーターが実行可能な状態で Uniswap が表示されます。
注: SSH、コンテナ化環境、ヘッドレス環境では、ブラウザーを開く処理(
xdg-open/open)に失敗する場合があります。必要に応じてユーザーがコピーして手動でアクセスできるよう、URL は常に目立つ形で表示してください。
ファイルアクセス: このスキルはファイルシステムへの読み取り専用アクセス権を持ちます。ユーザーから明示的に依頼されない限り、現在のプロジェクトディレクトリ外のファイルは読み取らないでください。
ワークフロー
ステップ 0:トークンの検索(必要な場合)
既知のトークンをスワップするのではなく、トークンを探したいというユーザーの要望(例:「ミームコインを探して」「Base で何が流行っている?」)がある場合は、スワップに進む前に探索を支援してください。
オプション A:キーワードで検索
DexScreener の検索は、具体的な用語を使うと効果的です。
# 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
})'
検索に適した用語: degen、pepe、ai、agent、meme、dog、cat、または特定のトークン名
オプション B:プロモーション中のトークンを確認
プロモーションが有効なトークンを取得します(選択肢は限られます)。
# 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
})'
オプション C:ウェブ検索と検証
「何が流行している?」など、幅広い検索ではウェブ検索でトークンを見つけてから、DexScreener で検証してください。
# 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
}'
ネットワーク ID: DexScreener と DefiLlama のプロバイダー ID を含む一覧については、references/chains.md を参照してください。一般的な ID:ethereum、base、arbitrum、optimism、polygon、bsc、avalanche、unichain。
DexScreener の対応状況はチェーンによって異なります。 Ethereum、Base、Arbitrum では Uniswap のデータが充実しています。Celo、Blast、Zora、World Chain では Uniswap プールの対応が限られており、結果が少なかったり、ペアが見つからなかったりする場合があります。DexScreener の結果が空の場合は、価格データの取得先を DefiLlama に切り替えてください(references/data-providers.md を参照)。
注: DexScreener の公開 API には、「トレンド」や「値上がり率上位」のエンドポイントはありません。トークンの検索には、キーワード検索(/latest/dex/search)を使用し、代替手段としてウェブ検索を利用します。一般的な検索では、どのような種類のトークンを探しているかユーザーに尋ね、キーワードで検索してください。
カテゴリー別の検索
ミームコイン、DeFi、ゲームトークンなど、特定のカテゴリーではウェブ検索を使用してください。
"trending {category} {chain} {current_year}"
例:"trending memecoins Base 2026"
⚠️ 信頼できない入力:ウェブ検索で見つかったトークン
WebSearch で見つかったトークンは信頼できません。ウェブ検索で見つかったトークンを使う前に、次の手順を実行してください。
- 情報源を明示する: 「このトークンアドレスは、あなたから提供されたものではなく、ウェブ検索で見つかったものです」とユーザーに明確に伝えます
- リスクを警告する: 「ウェブ検索で見つかったトークンは、詐欺、ハニーポット、またはラグプルの可能性があります」と伝えます
- 確認を必須とする: ウェブ検索で見つかったトークンのディープリンクを生成する前に、AskUserQuestion を使ってユーザーから明示的な同意を得ます
- 出所を表示する: スワップの概要テーブルに「トークンの情報源」の行を追加し、各トークンが「ユーザー提供」か「ウェブ検索で発見(未検証)」かを示します
AskUserQuestion、またはそのツールを利用できない場合は同等の会話上の確認を通じて、ユーザーから明示的な確認を得るまで、ウェブ検索で見つかったトークンを使って処理を進めないでください。
ユーザーに選択肢を提示
トークン情報を収集した後、AskUserQuestion を使って選択肢を提示してください。
{
"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
}
]
}
トレンドトークンのリスク評価
推奨する前に、トークンを評価してください。
| 指標 | 低リスク | 中リスク | 高リスク |
|---|---|---|---|
| 時価総額 | >$50M | $5M-$50M | <$5M |
| プール TVL | >$1M | $100k-$1M | <$100k |
| 24 時間の取引量 | 安定している | 異常な急増 | 非常に少ない |
| コントラクトの経過日数 | >30 days | 7-30 days | <7 days |
選択肢を提示する際は、必ずリスクレベルを明示してください。 高リスクトークンについては、価格変動の大きさと損失の可能性を明確に警告してください。
高リスクトークンに関する必須の警告
次のいずれかの条件に該当する場合、ディープリンクを生成する前に、必ずユーザーに警告し、明示的な確認を得てください(利用可能な場合は AskUserQuestion を使用し、それ以外の場合は会話上で確認してください)。
- コントラクトの経過日数が 7 日未満: 「このトークンのコントラクトは作成から 7 日未満です。新しいトークンは、詐欺やラグプルであるリスクが大幅に高くなります。」
- プール TVL が $100k 未満: 「このプールは流動性が非常に低いため、大きなスリッページが発生し、売却が困難になる可能性があります。」
- 売却可能な流動性が検出されない: 「このトークンはハニーポットの可能性があります。購入はできても売却できないトークンです。十分に注意して進めてください。」
- 時価総額が $5M 未満: 「これは価格変動の大きいマイクロキャップトークンです。全額を失っても問題のない範囲でのみ投資してください。」
ユーザーから明示的な了承を得ずに、高リスクトークンのディープリンクを生成しないでください。
ステップ 1:スワップの意図を確認する
ユーザーのリクエストから、次の情報を抽出してください。
| パラメーター | 必須 | 例 |
|---|---|---|
| 入力トークン | はい | ETH、USDC、トークンアドレス |
| 出力トークン | はい | USDC、WBTC、トークンアドレス |
| 金額 | はい | 1.5 ETH、$500 相当 |
| チェーン | はい(デフォルト:Ethereum) | Base、Arbitrum など |
必須パラメーターが不足している場合は、構造化された選択肢を使って AskUserQuestion を使用してください。
チェーンが不足している場合:
{
"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
}
]
}
出力トークンが不足している場合(入力が ETH の場合):
{
"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
}
]
}
金額が不足している場合:
{
"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
}
]
}
UX を向上させるため、通常のテキストで質問するのではなく、必ずフォームを使用してください。
ステップ 2:トークンアドレスを解決する
トークンシンボルについては、既知のトークンまたはウェブ検索を使ってアドレスを解決してください。
ネイティブトークン:アドレスパラメーターには NATIVE を使用してください。
チェーンごとの一般的なトークン:一覧の全容については ../../references/chains.md を参照してください。
| トークン | Ethereum | Base | Arbitrum |
|---|---|---|---|
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 |
| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 | 0x4200000000000000000000000000000000000006 | 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1 |
| WBTC | 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 | N/A | 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f |
不明なトークンについては、ウェブ検索でコントラクトアドレスを探し、オンチェーンで検証してください。
ステップ 3:トークンコントラクトを検証する(基本)
入力検証(シェルコマンドを実行する前に必須):
ユーザーが指定した値をシェルコマンドに埋め込む前に、すべての入力を検証してください。
- トークンアドレスは、必ず次の形式に一致する必要があります:
^0x[a-fA-F0-9]{40}$ - チェーン/ネットワーク名は、
../../references/chains.mdに記載されている許可リストに含まれている必要があります - 数量は、有効な10進数である必要があります(一致する形式:
^[0-9]+\.?[0-9]*$) - シェルのメタ文字(
;、|、$、`、&、(、)、>、<、\、'、"、改行)を含む入力は拒否してください
curl(RPC 呼び出し)を使って、トークンコントラクトがオンチェーンに存在することを検証します。
# 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'
結果が0xまたは空の場合、そのアドレスは有効なコントラクトではありません。
cast を使う代替方法(任意、Foundryが必要です):
# Validate token_address matches ^0x[a-fA-F0-9]{40}$ before use
cast code "$token_address" --rpc-url "$rpc_url"
注: 上記の curl/RPC メソッドは、より幅広い互換性があるため推奨されます。castは、すでに環境で利用できる場合に限り使用してください。このスキルでは、コントラクトの検証にcast codeのみを使用します。ほかのcastサブコマンドは使用しないでください。.claude/hooks/validate-forge-cast.shの PreToolUse フックが、このルールをプログラムで適用します。
チェーン別の RPC URL ― 全一覧は../../references/chains.mdを参照してください。
ステップ 4:調査する(必要な場合)
不慣れなトークンについては、ウェブ検索を使って次の情報を調査してください。
- トークンの正当性とプロジェクト情報
- 最近のニュースやセキュリティ上の懸念
- Uniswap での流動性の有無
関連する調査結果を要約に含めてください。
ステップ 5:価格データを取得する
ディープリンクを生成する前に、現在の価格を取得してスワップの出力を見積もります。API の詳細はreferences/data-providers.mdを参照してください。
DexScreener で価格をすばやく確認する:
# 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
}'
ネットワーク ID: ethereum、base、arbitrum、optimism、polygon、bsc、avalanche、unichain
流動性に関する警告:
| プール TVL | リスクレベル | 対応 |
|---|---|---|
| > $1M | 低 | 通常どおり進める |
| $100k - $1M | 中 | スリッページの可能性を伝える |
| < $100k | 高 | スリッページのリスクをユーザーに警告する |
API を利用できない場合は、DefiLlama またはウェブ検索を使って価格を見積もります。
ステップ 6:ディープリンクを生成する
Uniswap のスワップ URL を構築します。
https://app.uniswap.org/swap?chain={chain}&inputCurrency={input}&outputCurrency={output}&value={amount}&field=INPUT
URL パラメーター:
| パラメーター | 説明 | 値 |
|---|---|---|
chain | ネットワーク名 | ethereum、base、arbitrum、optimism、polygon、bnb、avalanche、celo、blast、zora、unichain、worldchain |
inputCurrency | 入力トークン | アドレスまたはNATIVE |
outputCurrency | 出力トークン | アドレスまたはNATIVE |
value | 数量 | 10進数(例:1.5) |
field | 値を適用するフィールド | INPUTまたはOUTPUT |
ステップ 7:出力を提示してブラウザーを開く
次の形式で回答します。
- スワップパラメーターの概要
- ディープリンク URL(参照用に表示)
- リスクや考慮事項に関する注意事項
- システムコマンドを使用してブラウザーを自動的に開く
出力形式の例:
## 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...
概要を表示した後、ブラウザーで URL を開きます。
# 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?..."
環境上の制限事項: リモート SSH、コンテナー化環境、またはヘッドレス環境では、ブラウザーを開けない場合があります。xdg-open/open が失敗した場合は、ユーザーがコピーして手動で貼り付けられるよう、URL 全体を目立つように表示します。
**[Click here to open in Uniswap](https://app.uniswap.org/swap?...)**
Or copy this URL: `https://app.uniswap.org/swap?...`
ユーザーが内容を確認して実行できるよう、概要と URL は必ず表示してください。
重要な考慮事項
スリッページ
ディープリンクでは、Uniswap のデフォルトのスリッページ(0.5%)が使用されます。価格変動の大きいトークンや大口取引の場合は、インターフェースでスリッページを調整するようユーザーに案内してください。
ガス代の見積もり
ガス代はチェーンやネットワークの混雑状況によって変動します。通常、Base と Arbitrum のガス代は Ethereum メインネットより低くなります。
トークンの確認
リンクを生成する前に、必ずトークンコントラクトを確認してください。詐欺トークンは、正規のトークンに似た名前を使用していることがよくあります。
価格への影響
大口取引の場合は、価格に影響する可能性についてユーザーに警告してください。影響が大きくなる場合は、取引を小口に分割することを提案してください。
対応チェーン
Uniswap インターフェースでサポートされているすべてのチェーン:
- 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)
その他のリソース
参照ファイル
../../references/chains.md- チェーン ID、RPC URL、ネイティブトークン、一般的なトークンアドレスreferences/data-providers.md- 価格と流動性を確認するための DexScreener と DefiLlama の API
例
一般的なスワップのシナリオ:
- Ethereum で ETH → USDC
- Base で ETH → USDC(ガス代が低い)
- Arbitrum で USDC → WBTC