permissioned-pools-configurator について
Uniswap v4 Permissioned Poolの設定項目を収集・検証するインタラクティブなスキルです。`permissioned-pools-deployer`で使うデプロイ前のJSON設定を作成し、コントラクト呼び出しやトランザクション送信は行いません。
主な機能
- 014段階でのパラメーター収集
- 02設定スキーマに基づく入力検証
- 03JSON設定の出力
- 04未解決アドレスを`RESOLVE`で記録
- 05コントラクト呼び出しや署名なし
活用シーン
- 01デプロイワークフロー用のプール設定準備
- 02未解決アドレスの記録
- 03設定出力前の入力値確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ uniswap/ uniswap-ai --skill permissioned-pools-configuratorインストール後、Claude Code で/permissioned-pools-configuratorを入力して読み込まれたか確認します。
同梱ファイルreferences/config-schema.mdreferences/parameter-reference.md
詳細
Permissioned Pools Configurator
Uniswap v4 Permissioned Pool 用の対話型一括フォーム設定ツールです。セットアップに必要なすべてのパラメーターを収集して検証し、permissioned-pools-deployer スキルがオンチェーンの一連の処理を実行するために使用する、単一の JSON 設定オブジェクトを表示します。これらのパラメーターに関するコントラクトの仕組みについては、permissioned-pools-issuer を参照してください。
ランタイムの互換性: このスキルは、パラメーターをまとめて収集するために
AskUserQuestionを使用します。実行環境でAskUserQuestionを使用できない場合は、同じグループ分けで同じパラメーターを自然言語での会話を通じて収集し、各グループの後に同じ検証を行ってください。
対象範囲と免責事項
これは設定ツールであり、デプロイ手順の案内でもコンプライアンス審査でもありません。
- ✅ Permissioned Pool のセットアップに必要な入力を収集して検証し、JSON ドキュメントを生成します。コントラクトの呼び出しやブロードキャストは行わず、署名鍵も保持しません。
- ✅ これはコントラクトの仕組みに関する情報としてのみ扱ってください。 このスキルは、法律、金融、投資、税務に関する助言ではなく、トークン、許可リスト、KYC または AML プログラム、あるいは設定のコンプライアンス審査でもありません。各パラメーターの意味と、誤りがあった場合に発生する問題を説明します。
- ✅ コントラクトアドレスを作り出すことはありません。入力されたアドレスはそのまま記録します。デプロイガイドの表で確認する必要がある場合や、発行者がまだ決定していない場合など、現時点で取得できないアドレスは、推測したり記憶から補ったりせず、文字列
"RESOLVE"として保存します。 - ✅ 出力された設定を自分で確認し、デプロイフローに渡す前に、解決が必要と示されたすべてのアドレスを改めて確認してください。
- ✅ リポジトリの使用ガイドラインをお読みください。 リポジトリルートの
DISCLAIMER.mdは、このリポジトリ内のすべてのスキルに適用されます。各スキルは現状有姿で保証なしに提供され、法律、金融、投資、税務に関する助言を構成するものではありません。また、利用上の制限と、スキルを使用して金融情報を生成し、それを個人または消費者に直接提示する場合に適用される AI 開示義務について定めています。ユーザーにこの文書を案内してください。
この説明をインラインで(引用するか、自分の言葉で)伝え、同じ応答内で設定フローを続けてください。これは参照情報およびデータ収集の内容であり、アクションを伴うデプロイ手順ではないため、ここで確認を求める必要はありません。デプロイヤースキルでは、ガスを消費する操作を行う前に確認が必要です。
この設定の内容(および対象外)
出力されるのはデプロイ前の計画であり、オンチェーンにすでに存在するものの記録ではありません。
PermissionsAdapterアドレスはこの設定には含まれません。 デプロイヤーのステップ 2(createPermissionsAdapter)で作成されるまで存在しません。発行者がこのトークン用のデプロイ済みアダプターをすでに持っている場合は、再実行/インポートのシナリオに該当しますが、このスキルは現在対応していません。アドレスを注記として収集し、ここには追加せず、代わりにデプロイヤースキルの事前確認で確認してください。ここで対象外となるのはアダプターアドレスのみであり、依頼の残りを妨げるものではありません。 以下のフローの説明どおり、ユーザーが入力した(または"RESOLVE"と指定した)その他すべてのフィールドの検証を続け、出力設定に含めてください。- この設定に記録するトークンアドレスは、基盤となる permissioned token のみです。 2 つのアドレスの違いについては
permissioned-pools-issuerを参照してください。デプロイヤーが後で構築するプール通貨はアダプターであり、デプロイ時に導出されるため、ここでは設定しません。 - ラッパーとフックのアドレスはチェーン固有であり、時間とともに変わります。 対象チェーン用のアドレスをすでに確認済みかどうかを尋ね、未確認の場合は値を設定せず、解決が必要であることを示します。
設定フロー
最大4つの質問を4回に分けて、パラメーターを収集します。各回の後、次に進む前にすべての回答を
config-schema.md に照らして検証し、収集済みの項目と残りの項目をまとめた進捗状況を表示します。
各フィールドの意味、値の選び方、値が誤っていた場合に発生する問題については、すべて
parameter-reference.md に記載されています。
先行回答または質問のスキップ
ユーザーは、自由形式のメッセージ1つで複数回分の質問に答えたり、残りの質問をスキップしてすぐに完了するよう求めたりする場合があります。続行するかどうかを尋ねるために、設定全体の提示を保留しないでください。代わりに、ユーザーが提示した内容をすべて config-schema.md に照らして検証し、未入力のアドレス型フィールドすべてに文字列 "RESOLVE" を適用してください(チェッカーが to-be-deployed の場合の allowlistChecker.address は null にします)。そのうえで、同じ回答内にその部分的な設定を提示します。
"RESOLVE" の代替値がないフィールド(検証デポジット額、プール通貨、手数料ティア、ティック間隔、開始価格、シーディング)には安全なデフォルト値がありません。推測で埋めず、それぞれ回答がまだ必要であることを明示し、それらについてのみ質問してください。これには、Batch 2 で推奨オプションとして「1 wei」が挙げられている場合でも、検証デポジット額が含まれます。ユーザーが実際に選択していないメニュー項目を、スキルがユーザーに代わって適用してはなりません。未回答の検証デポジット額は、他の代替値のないフィールドとまったく同様に扱い、すでに解決済みの "1" として扱わないでください。
バッチごとの確認手順をスキップしても、検証をスキップすることにはなりません。上記のルールは、ユーザーが提示した内容すべてに引き続き適用されます。
バッチ 1:ネットワーク、トークン、所有者(4 つの質問)
質問 1 — ネットワーク
- プロンプト:「この許可型プールはどのネットワーク向けですか?」
- 選択肢:「Ethereum Mainnet(チェーン ID 1)」、「Unichain(チェーン ID 130)」、「Sepolia(チェーン ID 11155111)」、カスタムチェーン ID(「Other」経由)
- プロンプト内の注記:特定のチェーンで許可型プールのコントラクトが利用可能であることを、このスキルは保証しません。続行する前に、デプロイガイドの
#deployment-addressesテーブルにそのチェーンの行があることを確認してください。 - 保存先:
chainId
質問 2 — 対象となる許可型トークン
- プロンプト:「上場する許可型 ERC-20 のアドレスは何ですか?」
- 選択肢:「まだデプロイされていない」(文字列
"RESOLVE"を保存)、カスタムアドレス(「Other」経由) - 検証:
^0x[a-fA-F0-9]{40}$、または未デプロイの場合は文字列"RESOLVE" - 保存先:
permissionedToken
質問 3 — 許可リストチェッカー
- プロンプト:「このトークン用の許可リストチェッカーは、すでにデプロイされていますか?」
- それぞれ、生成される正確な
allowlistChecker値に対応する選択肢:- 「はい、既存のアドレスを使用する」(続けて「Other」経由でアドレスを尋ねる)→
mode: "existing"、addressにそのアドレスを設定します。 - 「いいえ、これからデプロイする必要があります」→
mode: "to-be-deployed"、addressにnullを設定します。
- 「はい、既存のアドレスを使用する」(続けて「Other」経由でアドレスを尋ねる)→
- 検証:「existing」を選択した場合は、上記のアドレス形式であること
- 保存先:
allowlistChecker.mode(existing|to-be-deployed)、allowlistChecker.address
質問 4 — アダプターの所有者
- プロンプト:「
PermissionsAdapter(initialOwner)の所有者にするアドレスは何ですか?」 - 選択肢:「まだ決定していない — 解決が必要なものとしてマークする」(文字列
"RESOLVE"を保存)、カスタムアドレス(「Other」経由) - プロンプト内の注記:このキーでは、許可リストチェッカーの変更、ラッパーの追加や削除、スワップの一時停止と再開、あらゆる LP ポジションの強制退出が可能です。公開されているガイドではマルチシグを推奨しています。この手順を終わらせるためだけに急いで選ばないでください。マルチシグやキーがまだ決まっていない場合は、代わりに解決マーカーを使用してください。
- 検証:
^0x[a-fA-F0-9]{40}$に一致し、ゼロアドレスではないこと。または文字列"RESOLVE" - 保存先:
adapterOwner
検証: チェーン ID が正の整数であること、トークンアドレスが有効なアドレスまたは文字列 "RESOLVE" であること、「existing」を選択した場合はチェッカーアドレスがアドレス正規表現に一致すること、アダプターの所有者が有効な非ゼロアドレスまたは文字列 "RESOLVE" であることを確認してください。収集した 4 つの値の概要を表示し、"RESOLVE" のままのフィールドがあれば明示してください。
バッチ 2:検証とコアラッパー(4 つの質問)
質問 1 — 検証用デポジット額
- プロンプト:「検証のために、基盤トークンをいくらデポジットしますか?」
- 選択肢:「1 wei(推奨)」、カスタム額(「その他」から指定)
- プロンプト内の注記:このデポジットはアダプターのミント可能な余力となり、出金関数はなく、1 wei で十分です。1 より大きい値を選ぶ前に、 パラメーターリファレンス を参照してください。
- 「推奨」とは、質問された際に選択する値を示すものであり、この質問がスキップされた場合に、ユーザーに代わって
"1"を入力してよいという意味ではありません。上記の 先行回答またはスキップして先に進む回答 を参照してください。 - 保存先:
verificationDepositAmount
質問 2 — PermissionedPositionManager アドレス
- プロンプト:「このチェーンの
PermissionedPositionManagerアドレスは特定できていますか?」 - 選択肢:「まだ特定できていない — 解決対象としてマーク」(文字列
"RESOLVE"をそのまま保存)、カスタムアドレス(「その他」から指定) - 検証:アドレス形式、または文字列
"RESOLVE" - 保存先:
allowedWrappers.permissionedPositionManager
質問 3 — Universal Router(v2.2 以降)アドレス
- プロンプト:「このチェーンの Universal Router
#v2.2(またはそれ以降)のアドレスは特定できていますか?」 - 選択肢:「まだ特定できていない — 解決対象としてマーク」(文字列
"RESOLVE"をそのまま保存)、カスタムアドレス(「その他」から指定) - プロンプト内の注記:通常の
UniversalRouterデプロイメントキーは別の、権限管理されていないルーターを指します。ここで使用できるのは#v2.2のデプロイメントのみです。 - 検証:アドレス形式、または文字列
"RESOLVE" - 保存先:
allowedWrappers.universalRouterV2_2
質問 4 — PermissionedHooks アドレス
- プロンプト:「このチェーンの
setAllowedHook用のPermissionedHooksアドレスは特定できていますか?」 - 選択肢:「まだ特定できていない — 解決対象としてマーク」(文字列
"RESOLVE"をそのまま保存)、カスタムアドレス(「その他」から指定) - プロンプト内の注記:これは共通のフックアドレスで、ポジションマネージャーに
setAllowedHookで登録されます。ラッパーとして登録されることはありません。 - 検証:アドレス形式、または文字列
"RESOLVE" - 保存先:
hook
**検証:**デポジット額が、トークンの最小単位で表された正の整数(ゼロ以外)であることを確認してください。また、各アドレスフィールドが有効なアドレスまたは文字列 "RESOLVE" のいずれかであり、推測または創作された値ではないことを確認してください。概要を表示してください。
バッチ 3:残りのラッパーとプールの通貨(4 つの質問)
質問 1 — V4Quoter のアドレス
- プロンプト:「このチェーン用の
V4Quoterのアドレスは解決済みですか?」 - 選択肢:「まだ解決していません — 解決対象としてマークする」(リテラル文字列
"RESOLVE"を保存)、カスタムアドレス(「その他」から入力) - 検証:アドレス形式、またはリテラル文字列
"RESOLVE" - 保存先:
allowedWrappers.v4Quoter
質問 2 — MixedRouteQuoterV2 のアドレス
- プロンプト:「このチェーン用の
MixedRouteQuoterV2のアドレスは解決済みですか?」 - 選択肢:「まだ解決していません — 解決対象としてマークする」(リテラル文字列
"RESOLVE"を保存)、カスタムアドレス(「その他」から入力) - 検証:アドレス形式、またはリテラル文字列
"RESOLVE" - 保存先:
allowedWrappers.mixedRouteQuoterV2
質問 3 — ペア通貨
- プロンプト:「許可対象のトークンとプールでペアにする通貨は何ですか?」
- 選択肢:「ネイティブ ETH」、カスタム ERC-20 アドレス(「その他」から入力)
- プロンプト内の注記:プールにおける許可対象トークン側は常にアダプターであり、 基礎トークンではありません。この質問は、_もう一方_の通貨についてのみ尋ねています。
- 検証:ERC-20 のアドレス形式で、ゼロアドレスではないこと。またはリテラル文字列
"native"(ネイティブ通貨を示すセンチネル。詳しくはアドレスの検証 を参照)。ここでユーザーがゼロアドレスを入力した場合は"native"を意味します。 ゼロアドレスではなく、"native"を記録してください。 - 保存先:
pool.pairedCurrency
質問 4 — 手数料ティア
- プロンプト:「プールで使用する手数料ティアは何ですか?」
- 選択肢:「0.05%(500)」、「0.30%(3000)」、「1.00%(10000)」、「カスタム」(「その他」から入力)
- 検証:正の整数(ベーシスポイントの 100 分の 1 単位)
- 保存先:
pool.feeTier
検証: 残りのラッパーフィールドがどちらも有効なアドレスまたはリテラル文字列
"RESOLVE" であること、ペア通貨が有効なゼロ以外のアドレスまたはリテラル文字列
"native" であること、手数料ティアが正の整数であることを確認します。ペア通貨が解決済みの
アドレスで、permissionedToken も解決済みのアドレスの場合は、2 つのアドレスが異なることを確認します。
許可対象トークン自身とペアにすると、PoolManager のレベルで失敗する PoolKey が作成されるか、
誰も意図していないプールが作成されます(パラメーターリファレンス
を参照)。これまでに収集した 4 つすべてのラッパー、フック、プール通貨の概要を表示し、
"RESOLVE" のままのすべてのフィールドに印を付けます。
バッチ 4:価格設定とシーディング(3 つの質問)
質問 1 — ティック間隔
- プロンプト:「プールではどのティック間隔を使用しますか?」
- 選択肢:「10(ステーブルコインに似たペア)」、「60(標準)」、「200(広い価格範囲のペア)」、カスタム (「その他」から入力)
- 検証:正の整数
- 保存先:
pool.tickSpacing
質問 2 — 初期価格
- プロンプト:「ペア通貨/権限付きトークンで表した、プールの初期価格はいくらにしますか?」
- 選択肢:「1:1(等価値比率)」、カスタム比率(「その他」から入力)
- 検証:正の数値
- 保存先:
pool.startingPriceRatio(人間が読める形式の比率です。デプロイ用スキルは、初期化時にこれをsqrtPriceX96に変換します。この変換は両方の通貨の小数桁数に依存しますが、設定時点ではまだ解決されていないためです)
質問 3 — シーディングの意向
- プロンプト:「今回のセットアップの一環として、流動性をシードする予定ですか?」
- 選択肢と、それぞれが生成する
seeding.intentの値:- 「はい、アダプター所有者のウォレットから」→
intent: "seed-now"、walletには、バッチ 1 ですでにadapterOwnerとして収集した同じアドレスを設定します。adapterOwnerが実際のアドレスの場合にのみ、この選択肢を提示してください。文字列"RESOLVE"の場合は提示しないでください。seeding.walletは常に実際のアドレスでなければならないため(以下の検証を参照)、未解決の所有者を引き継ぐことはできません。 - 「はい、別のウォレットから」(「その他」からアドレスを入力)→
intent: "seed-now"、walletにはそのアドレスを設定します - 「まだ行わない — プールの作成のみ」→
intent: "none"、wallet: null
- 「はい、アダプター所有者のウォレットから」→
adapterOwnerが"RESOLVE"の場合は、2 つ目と 3 つ目の選択肢のみ提示します。1 つ目の選択肢は、無効状態で表示するのではなく、リストから完全に削除してください。- プロンプトに次の注意書きを含めてください:流動性をシードするウォレットとポジションを受け取るウォレットの両方で、最初のミント前に発行者自身の許可リスト上で
LIQUIDITY_ALLOWEDが必要です。アダプター所有者であっても、流動性の経路における権限は付与されません。 - 検証:
intentが"seed-now"の場合、walletは必須で、アドレスの正規表現に一致する必要があります。文字列"RESOLVE"や、その他のセンチネル値は使用できません。intentが"none"の場合、walletはnullでなければなりません。このフローでは"seed-later"は生成されません。この列挙値は、フロー外で設定を編集または拡張した場合のためにスキーマに存在するものであり、これら 3 つの選択肢から出力される値ではありません。 - 保存先:
seeding.intent、seeding.wallet
検証: ティック間隔が正の整数であること、初期価格比率が正の数値であること、また上記で選んだ分岐に応じて、seeding.wallet が有効な "RESOLVE" 以外のアドレス(intent が "seed-now" の場合)か、null(intent が "none" の場合)であることを確認してください。adapterOwner から引き継ぐ予定だった場合でも、seeding.wallet に文字列 "RESOLVE" は指定できません。上記の選択肢の制限を参照してください。4 つすべてのバッチで収集した設定全体を表示してください。
設定の生成と表示
収集したすべての情報を、config-schema.md で定義されている JSON 形式にまとめ、最上位で chainId をキーにします。
{
"<chainId>": {
"permissionedToken": "...",
"allowlistChecker": { "mode": "...", "address": "..." },
"adapterOwner": "...",
"verificationDepositAmount": "...",
"allowedWrappers": {
"permissionedPositionManager": "...",
"universalRouterV2_2": "...",
"v4Quoter": "...",
"mixedRouteQuoterV2": "..."
},
"hook": "...",
"pool": {
"pairedCurrency": "native",
"feeTier": 3000,
"tickSpacing": 60,
"startingPriceRatio": 1
},
"seeding": { "intent": "seed-now", "wallet": "..." }
}
}
この JSON をトランスクリプトに直接表示してください。ファイルを自動作成しないでください。 ユーザーがコピーするか、以下の次の手順を尋ねる質問でファイルパスを選択できるようにします。
サマリーの表示
JSON の直後に、人間が読める形式のサマリーを表示します。
- ネットワークとチェーン ID。
- 基盤となるトークンと許可リストチェッカーのモード。
- アダプター所有者。
- 検証用デポジット額と、返金されないことを一文で注意喚起。
- すべてのラッパーとフック。それぞれに 解決済み または 要解決 のフラグを付けます。
- プール通貨、手数料ティア、ティック間隔、初期価格比率。
- シーディングの意向とウォレット。ウォレットに
LIQUIDITY_ALLOWEDが必要であることを注意喚起します。 - 検証チェックリスト:
config-schema.mdのどのルールに合格したか、また、この設定をデプロイに使用できるようになる前に、どのフィールドで実際のアドレスが必要かを示します。
次のステップ
ユーザーに何をしたいか尋ねます。
- 「ファイルに保存」— ファイルパスを尋ねます。デフォルトは
permissioned-pool-config.jsonです。.jsonで終わる相対パスを必須とし、絶対パス(先頭が/)を拒否し、先頭が~のパスを拒否します(これを展開するランタイムでは、作業ディレクトリの外部に書き込まれる可能性があり、Claude Code 自体の設定ストアを上書きする場合もあります)。また、..セグメントを含むパスも拒否します。パスを解決し、書き込み前に、解決後のパスが現在の作業ディレクトリ内にとどまることを確認します。解決後のパスがすでに存在する場合は、上書き前に確認を求めます。package.jsonやtsconfig.jsonなど、このスキルとは無関係に見えるファイルも対象です。パスが拒否された場合は、デフォルトを黙って代用するのではなく、一度だけ再入力を求めます。その後、上記の JSON オブジェクトをそのまま書き込みます。(この検証は、このリポジトリ内の他のスキルの「ファイルに保存」手順より意図的に厳格です。先頭が~のパスが~/.claude.jsonを指定できることがセキュリティ監査で判明したため、~と..の拒否を追加しました。ほかの箇所のより簡易な同等の手順に合わせて緩和せず、ここではそのまま維持してください。) - 「セットアップの手順を表示」—
permissioned-pools-deployerを案内します。 - 「設定を変更」— 該当するバッチを再実行します。
- 「終了」— ここで終了します。ユーザーはトランスクリプトから JSON をコピーできます。
このフローの実装者向けメモ
- トークン、ラッパー、フック、アダプター所有者のアドレスを記憶から補完してはいけません。 ユーザーが入力しない場合は、そのフィールドに文字列リテラル
"RESOLVE"をそのまま格納します。例外はありません。入力途中のアドレスを「親切心から」補完することも禁止です。 - 毎回、バッチ処理、検証、要約を行います。 4つのバッチを、間に検証と要約のステップを挟まずに続けて実行してはいけません。これにより、不正な入力が次のバッチのデフォルトに引き継がれるのを防ぎます。
- このスキルはチェーンの状態を読み取らず、RPC を取得せず、デプロイメントの JSON ファイルも参照しません。 ツール一覧に
BashやWebFetchが含まれていないのは意図的です。Uniswap/contractsのdeployments/json/<chainId>.jsonやデプロイガイドの表を参照したアドレスの解決は、ユーザーが行う作業、またはデプロイヤースキルのプリフライトで後から行う作業です。