dex-execution について
Jupiterを使ったSolanaスワップ実行向けのスキルで、見積もり、トランザクション構築、署名、送信、確認を扱います。実行前の見積もり確認と明示的なユーザー承認をワークフローに含みます。
主な機能
- 01Jupiter経由でルート付き見積もりを取得
- 02金額、価格影響、ルートを表示
- 03スワップトランザクションを構築・シミュレーション
- 04トランザクションの署名、送信、確認
- 05スリッページ、優先手数料、エラーへの対応
活用シーン
- 01SOLやUSDCなどのトークン交換
- 02実行前の見積もりと価格影響の確認
- 03ネットワーク混雑に応じた優先手数料の設定
- 04期限切れやスリッページ超過のトラブル対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill dex-executionインストール後、Claude Code で/dex-executionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/jupiter_api.mdsafety_checklist.mdtransaction_lifecycle.mdscripts/get_quote.pysimulate_swap.py詳細
DEX の実行 — Jupiter 経由の Solana スワップ実行
Raydium、Orca、Meteora、Phoenix、Lifinity、その他 20 以上の取引所を経由してルートを決定する、主要な DEX アグリゲーター Jupiter を通じて Solana 上でトークンスワップを実行します。
概要
Jupiter は Solana の主要な DEX 全体の流動性を集約し、最適なスワップルートを見つけます。1 回のスワップで複数のプールに分割し、中間トークンを経由して価格への影響を最小限に抑える場合があります。Jupiter v6 API はルートの検出、トランザクションの構築、手数料の最適化を処理し、コード側では見積もり、ユーザーの確認、署名、送信を処理します。
ベース URL: https://quote-api.jup.ag/v6
実行パイプライン
すべてのスワップは、この 7 ステップのパイプラインに従います。ステップ 2〜3(表示と確認)は決して省略しないでください。
ステップ 1 — 見積もりを取得
import httpx
params = {
"inputMint": "So11111111111111111111111111111111111111112", # SOL
"outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", # USDC
"amount": 1_000_000_000, # 1 SOL in lamports
"slippageBps": 50, # 0.5%
}
resp = httpx.get("https://quote-api.jup.ag/v6/quote", params=params)
quote = resp.json()
ステップ 2 — 見積もりをユーザーに表示
続行する前に、必ず以下のフィールドを表示してください。
| フィールド | ソース |
|---|---|
| 入力額 | quote["inAmount"](トークンの最小単位) |
| 出力額 | quote["outAmount"] |
| 最低受取額 | quote["otherAmountThreshold"] |
| 価格への影響 | quote["priceImpactPct"] |
| ルート | quote["routePlan"] — 使用する DEX |
| スリッページ | リクエストした slippageBps |
ステップ 3 — ユーザーの確認を必須にする
⚠️ SWAP PREVIEW
Selling: 1.000 SOL
Buying: ~142.50 USDC
Min recv: 141.79 USDC (0.5% slippage)
Impact: 0.01%
Route: Raydium V4 → USDC
Proceed? [y/N]
ユーザーから明示的な「はい」がない限り、絶対に続行しないでください。
ステップ 4 — トランザクションを構築
swap_body = {
"quoteResponse": quote,
"userPublicKey": "YourPubkeyBase58...",
"wrapAndUnwrapSol": True,
"dynamicComputeUnitLimit": True,
"prioritizationFeeLamports": "auto",
}
resp = httpx.post("https://quote-api.jup.ag/v6/swap", json=swap_body)
swap_data = resp.json()
swap_tx = swap_data["swapTransaction"] # base64-encoded transaction
ステップ 5 — トランザクションに署名
import base64
from solders.transaction import VersionedTransaction
from solders.keypair import Keypair
raw_tx = base64.b64decode(swap_tx)
tx = VersionedTransaction.from_bytes(raw_tx)
keypair = Keypair.from_base58_string(os.environ["WALLET_PRIVATE_KEY"])
tx.sign([keypair])
ステップ 6 — トランザクションを送信
rpc_url = os.environ.get("SOLANA_RPC_URL", "https://api.mainnet-beta.solana.com")
signed_bytes = bytes(tx)
payload = {
"jsonrpc": "2.0", "id": 1,
"method": "sendTransaction",
"params": [
base64.b64encode(signed_bytes).decode(),
{"encoding": "base64", "skipPreflight": False,
"maxRetries": 3, "preflightCommitment": "confirmed"}
],
}
resp = httpx.post(rpc_url, json=payload)
sig = resp.json()["result"]
print(f"Submitted: https://solscan.io/tx/{sig}")
ステップ 7 — トランザクションを確認
import time
for attempt in range(30):
payload = {
"jsonrpc": "2.0", "id": 1,
"method": "getSignatureStatuses",
"params": [[sig], {"searchTransactionHistory": False}],
}
resp = httpx.post(rpc_url, json=payload)
status = resp.json()["result"]["value"][0]
if status and status.get("confirmationStatus") in ("confirmed", "finalized"):
print(f"Confirmed at slot {status['slot']}")
break
time.sleep(2)
else:
print("Transaction not confirmed within 60s — check explorer")
Jupiter API v6 エンドポイント
| エンドポイント | メソッド | 用途 |
|---|---|---|
/quote | GET | ルーティングによる最良価格の見積もりを取得 |
/swap | POST | 見積もりからスワップトランザクションを構築 |
/swap-instructions | POST | 個別のインストラクションを取得(上級者向け) |
/price?ids=token1,token2 | GET | 簡易価格照会(v2) |
/tokens | GET | サポート対象のトークンをすべて一覧表示 |
パラメーターとレスポンスの詳細については、references/jupiter_api.md を参照してください。
主なパラメーター
スリッページ(slippageBps)
| トークンの種類 | 推奨範囲 | 備考 |
|---|---|---|
| SOL、USDC、主要トークン | 50-100(0.5-1%) | 流動性が安定 |
| 中型トークン | 100-300(1-3%) | 流動性が変動 |
| PumpFun/ミームトークン | 500-2000(5-20%) | 板が薄く、ボラティリティが高い |
| 新規ローンチ(開始から 1 時間未満) | 1000-3000(10-30%) | ボラティリティが極めて高い |
動的スリッページ
スワップリクエストで dynamicSlippage: true を設定すると、現在の市場状況に基づいて Jupiter がスリッページを自動調整します。ほとんどの用途で推奨されます。
優先手数料(prioritizationFeeLamports)
優先手数料によって、ブロック内のトランザクションの順序が決まります。
| レベル | microLamports | 使用する場面 |
|---|---|---|
| 低 | 10,000-50,000 | 通常時 |
| 中 | 50,000-200,000 | 混雑が中程度のとき |
| 高 | 200,000-1,000,000 | 混雑が激しいとき/時間的制約があるとき |
| 緊急 | 1,000,000-5,000,000 | ミームコインのローンチ、NFT のミント |
| 自動 | "auto" | Jupiter が推定 |
ほとんどの場合は "auto" を使用してください。細かく制御するには、Helius の getPriorityFeeEstimate を照会してください。
その他のパラメーター
onlyDirectRoutes: マルチホップルーティングを省略します。処理は速くなりますが、価格が悪くなる場合があります。asLegacyTransaction: バージョン付きトランザクションではなく、レガシー形式を使用します。一部の古いウォレットで必要です。maxAccounts: トランザクション内のアカウント数を制限します(デフォルトは 64)。値を下げるとルートの選択肢が減りますが、確認の信頼性が向上します。platformFeeBps: インテグレーター手数料(ベーシスポイント単位)。出力額から差し引かれます。wrapAndUnwrapSol: SOL ↔ wSOL のラップ/アンラップを自動化します(デフォルトは true)。dynamicComputeUnitLimit: シミュレーションに基づいてコンピュートバジェットを自動設定します。
優先手数料の推定
# Using Helius getPriorityFeeEstimate
helius_url = f"https://mainnet.helius-rpc.com/?api-key={HELIUS_KEY}"
payload = {
"jsonrpc": "2.0", "id": 1,
"method": "getPriorityFeeEstimate",
"params": [{"accountKeys": [input_mint, output_mint],
"options": {"recommended": True}}],
}
resp = httpx.post(helius_url, json=payload)
fee = resp.json()["result"]["priorityFeeEstimate"]
トランザクション確認戦略
Solana のトランザクションライフサイクルの全容については、references/transaction_lifecycle.md を参照してください。
- 送信:明らかなエラーを検出できるよう、
skipPreflight: Falseを指定します - ポーリング:
getSignatureStatusesを 2 秒ごとに呼び出し、最大 60 秒間確認します - 確認できない場合:新しいブロックハッシュでトランザクションを再構築して再試行します(最大 3 回)
- ブロックハッシュの有効期限:ブロックハッシュの取得から約 60 秒後にトランザクションの有効期限が切れます
- 最終確認:トークン残高が想定どおり変化したことを検証します
エラー処理
| エラー | 原因 | 対処方法 |
|---|---|---|
"Slippage tolerance exceeded" | 価格が slippageBps の許容範囲を超えて変動しました | スリッページを増やすか、再試行します |
"Insufficient funds" | 入力トークンまたは手数料用の SOL が不足しています | 見積もりの前に残高を確認します |
"Transaction expired" | ブロックハッシュが古すぎます | 新しいブロックハッシュで再構築します |
"Transaction simulation failed" | 原因はさまざまです。ログを確認してください | シミュレーションログを解析して根本原因を特定します |
"Too many accounts" | ルートで使用するアカウントが多すぎます | maxAccounts の値を小さくするか、onlyDirectRoutes を使用します |
| HTTP 429 | レート制限に達しました | 指数的に遅延時間を延ばして再試行します |
HTTP 400 "No route found" | 流動性のある経路がありません | トークンのミントアドレスが正しいか確認し、スリッページを大きくしてみます |
安全要件
これらは、あらゆる実行コードで必ず守るべき要件です。
- 必ず見積もりの詳細を表示します(金額、価格への影響、ルート)
- 必ずユーザーに明示的な確認を求めます。自動実行は絶対にしないでください
- シミュレーションモードをデフォルトにします。明示的に有効化されていない限り、署名や送信を行わないでください
- 秘密鍵を保存したり、ログに記録したりしないでください。環境変数から読み込み、すぐに使用して破棄します
- 100% のスリッページは絶対に使用しないでください。これは一般的な詐欺・悪用の手口です
- トークンアドレスを検証します。スワップの前に、ミントアドレスが想定するトークンと一致することを確認します
- 価格への影響を確認します。2% を超える場合は警告し、ユーザーが上書きしない限り 10% を超える場合はブロックします
- SOL の予備残高を確保します。レンタル料と今後の手数料のために、最低 0.05 SOL を維持します
実行前・実行中・実行後の完全なチェックリストについては、references/safety_checklist.md を参照してください。
他のスキルとの連携
| スキル | 連携内容 |
|---|---|
slippage-modeling | トークンの流動性プロファイルに基づいて、最適な slippageBps を推定します |
liquidity-analysis | 見積もりの前に、プールの深さが取引額に対応できることを検証します |
position-sizing | リスクパラメーターに基づいて取引額を算出します |
risk-management | 実行の前に、ポートフォリオ全体のエクスポージャー制限を適用します |
jupiter-api | Jupiter エンドポイントの基盤となる API ドキュメント |
helius-api | 優先手数料の推定とトランザクションの監視 |
ファイル
リファレンス
references/jupiter_api.md— Jupiter v6 API のパラメーターとレスポンスに関する完全なリファレンスreferences/transaction_lifecycle.md— Solana のトランザクションライフサイクル、優先手数料、再試行戦略references/safety_checklist.md— 実行前・実行中・実行後の検証チェックリスト
スクリプト
scripts/get_quote.py— ルート分析付きで Jupiter のスワップ見積もりを取得して表示しますscripts/simulate_swap.py— 送信せずにスワップトランザクションを構築してシミュレーションします