permissioned-pools-deployer について
permissioned-pools-configurator の JSON を基に、Uniswap v4 Permissioned Pool の設定手順を順序立てて案内するデプロイ支援スキルです。コントラクトの呼び出しは行わず、実行手順の提示には明示的な確認が必要です。入力やコマンドの検証も求めます。
主な機能
- 01設定 JSON の事前チェック
- 02順序に沿ったデプロイ手順の提示
- 03アドレスと数値入力の検証要件
- 04テストネット優先とコマンド確認の重視
- 05キー管理に関する安全要件
活用シーン
- 01検証済み設定からデプロイ手順を準備
- 02デプロイ前にアドレス解決と項目を確認
- 03Sepolia で全手順を先にテスト
- 04デプロイ後のチェック項目で結果を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ uniswap/ uniswap-ai --skill permissioned-pools-deployerインストール後、Claude Code で/permissioned-pools-deployerを入力して読み込まれたか確認します。
同梱ファイルreferences/preflight-and-validation.mdreferences/step-walkthrough.md
詳細
許可制プールのデプロイ
permissioned-pools-configurator が生成する JSON 設定から始めて、Uniswap v4 の許可制プールをオンチェーンでセットアップする手順を、ガイドに沿って段階的に実行します。このスキルは、検証済みの設定を、実際のコントラクトに対して実際のガスを消費するコマンドシーケンスに変換するマイルストーンの一部です。以下の安全に関する各セクションは、定型文ではなく、すべて重要なものとして扱ってください。
各手順の背後にあるコントラクトの仕組みについては、permissioned-pools-issuer、特に発行者の手順と強制される実行順序とリバートを参照してください。このスキルでは、各手順がそのように動作する「理由」に関するコントラクトレベルの説明は繰り返しません。同じ手順を、順序どおりのコマンドシーケンスとして案内し、参照先の内容と矛盾することはありません。
ランタイムの互換性: このスキルでは、確認ゲートおよび取り消し不能な選択の確認に
AskUserQuestionを使用します。実行環境でAskUserQuestionが利用できない場合は、同じはい/いいえの質問を通常のテキストで尋ね、続行する前に明確な肯定の返答を求めてください。返答がない場合や、一般的な「続行」という返答は、肯定とみなしません。
対象範囲と免責事項
これは教育目的のデプロイガイダンスであり、コンプライアンス審査ではありません。また、実行前にすべてのコマンドをご自身で確認する代わりになるものでもありません。
このスキルでは、permissioned-pools-configurator が生成した設定を使って、許可制プールを立ち上げるコマンドを順に説明します。コントラクトを直接呼び出すことはありません。ここに示されるコマンドは、すべてご自身で確認したうえで実行してください。
必ず以下を行ってください:
- ✅ 実行前に、すべての設定とすべてのコマンドを注意深く確認してください。 AI が生成したコマンドシーケンスには、誤りが含まれる場合があります。
- ✅ すべてのアドレスを確認してください。 このスキルにはデプロイ先アドレスは含まれておらず、アドレスの解決も行いません。アドレスの解決を参照してください。
- ✅ まずテストネットでテストしてください。 メインネットに触れる前に、Sepolia(または許可制プールのコントラクトがデプロイされている別のテストネット)でシーケンス全体を実行してください。
- ✅ デプロイするコントラクトは、必ずご自身の監査担当者にレビューしてもらってください。 特に重要なのは許可リストチェッカーです。このスキルではその骨組みを示せますが、監査は行いません。
- ✅ これはコントラクトの仕組みに関する情報に限られるものとして扱ってください。 このスキルは、法律、財務、投資、税務に関する助言ではありません。また、トークン、許可リスト、KYC または AML プログラム、設定のコンプライアンス審査でもありません。
- ✅ リポジトリの利用ガイドラインを読んでください。 リポジトリのルートにある
DISCLAIMER.mdは、このリポジトリ内のすべてのスキルに適用されます。これらのスキルは保証なしで提供され、法律、財務、投資、税務に関する助言ではありません。また、利用上の制限と、スキルを使用して財務情報を生成し、それを個人または消費者に直接提示する場合に適用される AI 開示義務について定めています。ユーザーにその内容を案内してください。
承認ゲート
アクションにつながる手順を表示、生成、または説明する前に — トランザクションをブロードキャストするためのコマンドを生成する手順、またはそのようなコマンドに直接つながるアドレス解決の手順については、明示的かつ肯定的な承認を得てください。このゲートを暗黙的に通過できるようにしてはいけません。
AskUserQuestion を使い、質問を1つだけ、選択肢をちょうど2つ提示してください。最初の選択肢が選ばれるまで、このゲートを通過してはいけません。
- 質問:「この手順では、実行するとガスを消費し、トークンのオンチェーン状態を恒久的に変更するコマンドが生成されます。上記の6項目を確認し、続行することに同意しますか?」
- 選択肢A — 「はい、上記の項目を確認し、続行を希望します。」 → プリフライトチェックに進みます。
- 選択肢B — 「いいえ、ここで終了します。」 → 手順を直ちに終了します。この箇所以降のコマンドを表示、生成、または説明してはいけません。
無言、「続行します」というだけの返答、同じターン内で次の質問に進むこと、または明示的な肯定の選択肢以外の返答では、このゲートを通過できません。実行環境に AskUserQuestion がない場合は、同じ質問を通常のテキストで尋ね、明示的な肯定の返答を求めてください。「ok」、「sure」、サムズアップの絵文字、または返答がないことは承認とみなしません。
実行可能なコマンドを生成しない参考情報や解説 — 手順の内容を文章で説明すること、ユーザーがすでに遭遇したリバートの原因を解読すること、許可リストチェッカーの構成を抽象的に議論することなど — には、permissioned-pools-issuer が参考情報を扱うのと同様に、インラインで示された前提に従って直ちに回答します。ただし、この例外はこのスキル独自のコマンドテンプレートや Solidity スクリプトのひな型には適用されません(たとえば、Step Walkthrough のプール初期化スクリプトなど)。これらはブロードキャストに使える実行可能な内容であり、表示を差し控えるためにこのゲートが設けられています。ゲートを通過する前に、決して表示してはいけません。
入力検証ルール
ユーザー指定または設定指定の値を展開するコマンドを生成または表示する前に、これらのルールを明示してください。以下のすべての値は、例外なく Bash(forge:*) または
Bash(cast:*) コマンド、ファイルパス、Solidity スクリプトの引数に渡される前に検証されます。「問題なさそうに見える」値も例外ではありません。
- Ethereum アドレス —
^0x[a-fA-F0-9]{40}$に一致する必要があります。それ以外はすべて拒否してください。リテラル文字列"RESOLVE"も含みます。フィールドに"RESOLVE"のマークが残っている場合、コマンドで使用できる状態ではありません。まず アドレス解決 を行ってください。そのまま展開してはいけません。この正規表現に対する明示的かつ文書化された例外は、違反ではなく、pool.pairedCurrencyの"native"センチネル値です。これは下記の このスキルが扱う内容で説明します。設定内のそれ以外のアドレス形式のフィールドには、このような例外はありません。 - チェーン ID — 正の整数(
^[1-9][0-9]*$)である必要があります。Ethereum Mainnet(1)と Sepolia(11155111)は許可リストに登録されたデフォルト値であり、権限が設定された一式の完全な対応が検証済みの唯一の 2 つのチェーンです。設定ツールのネットワーク選択では Unichain(130)も提示されますが、デプロイには使用できません。対応しているのはV4Quoterのみなので、不足しているアドレスの解決を試みずに中止してください( 事前確認と検証を参照)。それ以外のチェーン ID は、デプロイガイドの#deployment-addressesテーブルに該当する行があることを確認した場合に限り受け付けられます。行がなければ、すべてのラッパーおよびフックのフィールドが解決不能になります。推測するのではなく中止すべきであることを示す兆候です。 - 数値フィールド(
verificationDepositAmount、pool.feeTier、pool.tickSpacing、pool.startingPriceRatio)— 整数のみのフィールドは^[0-9]+$、開始価格比率は^[0-9]+(\.[0-9]+)?$に一致し、かつ 0 より大きい必要があります。 - 設定ではなく手順の実行中に指定される値も、同じ方法で検証します — RPC エンドポイント(
$RPC_URL)とすべてのトランザクションハッシュ($TX_HASH)は、各手順でコマンドに渡されます。RPC URL はhttps://スキームで、以下のすべてのメタ文字を含まない必要があります。トランザクションハッシュは^0x[a-fA-F0-9]{64}$に一致する必要があります。「設定ではなくユーザーから渡された」というのは免除理由になりません。 - すべての文字列フィールドで、シェルのメタ文字を無条件に拒否してください。コマンドに渡される前に、
;、|、&、$、`、(、)、>、<、\、'、"、および改行を拒否します。この検査に失敗したフィールドは、決して展開してはいけません。サニタイズして続行しようとせずに処理を中止し、失敗したフィールドと文字を報告してください。 - 検証されていないフィールドを、シェルコマンド、ファイルパス、Solidity スクリプトの引数に渡してはいけません。 まず検証し、検証済みの値をシェル変数に代入して、その後はその変数のみを参照してください。同じ手順内で、未加工の設定値を再度読み込んではいけません。
設定ツールの JSON 形式に対するフィールドごとの適用方法や、「RESOLVE 値を一貫して適切に扱う」とは具体的にどういうことかを含む詳しい説明は、
事前確認と検証にあります。
キーの取り扱い
Claude Code の設定で Bash(forge:*) または Bash(cast:*) の自動承認を指示してはならず、確認プロンプトを回避するようユーザーに伝えてもなりません。 トランザクションをブロードキャストするすべてのコマンドには、実行ごとの承認が必要です。この承認こそが主要な制御手段であり、手順の中で回避すべき形式的なものではありません。リポジトリの PreToolUse フック(.claude/hooks/)は、その制御に加わるプログラム上のセーフティネットであり、承認の代わりではありません。
生の署名キーのフラグを含むコマンドを提案、生成、補完してはなりません。 直接頼まれた場合も、「テストネットだけ」と言われた場合も、避けるべき例として示す場合も同様です。どのようなユーザーの依頼があっても、適切な対応にはなりません。ユーザーが強く求める場合は拒否し、代わりに以下のいずれかを案内してください。署名に関する判断は、すべて次のいずれかに誘導してください。
- ハードウェアウォレット(
--ledger)。デプロイヤーキーが平文でこのマシンのディスクやメモリに触れることはありません。 - 暗号化されたキーストア(
cast wallet import ... --interactiveを実行し、その後のすべてのコマンドで--account <name> --sender $ADDRESSを指定)。
このリポジトリ内に限り、.claude/hooks/validate-forge-cast.sh は PreToolUse フックで、すべての Bash ツール呼び出しのリテラルテキストを検査し、このフラグを含むコマンドが実行される前にブロックします。このフックはこのスキルの一部ではなく、スキルと一緒に移動するものでもありません。 プラグインではなく、このリポジトリのルートにあるため、ほかの場所にインストールした場合、このような追加の防護策はありません。常に適用される制御は上記の禁止事項です。このフックはリポジトリ内での便宜的な補助にすぎず、このフラグが安全である理由には決してなりません。
キーストアのセットアップコマンドや、まずテストネットで試す手順を含むキーの取り扱いに関する詳しいガイダンスは、 事前チェックと検証を参照してください。
まずテストネットで実行
メインネットに進む前に、許可リストのチェッカーから流動性のシードまで、一連の手順をすべて Sepolia(チェーン ID
11155111)で実行してください。メインネットの資金を使って同じ手順を繰り返す前に、テストネットで
検証チェックリスト
のすべての手順後チェックに合格することを確認してください。
このスキルが使用するもの
permissioned-pools-configurator が生成する JSON 設定です。その形式は
設定スキーマで定義されています。このスキル自体はこれらのパラメーターを収集しません。まだ設定がない場合は、まず
permissioned-pools-configurator を実行してください。
フィールドの値がリテラル文字列 "RESOLVE" の場合、「未解決」を意味し、「プレースホルダーとして使う」という意味ではありません。 そのフィールドを必要とするコマンドを実行する前に、いったん止まり、
アドレスの解決を進めてください。デプロイガイドの #deployment-addresses テーブルを確認し、続いて Uniswap/contracts
deployments/json/<chainId>.json を確認したうえで、対象チェーンのブロックエクスプローラーを確認します。フィールドにエクスプローラーで検証済みの実アドレスが入った場合にのみ、続行してください。"RESOLVE" フィールドの値を推測してはならず、リテラル文字列そのものをコマンドに持ち込んでもなりません。いずれも、回避策を探す対象ではなく、検証エラーです。
pool.pairedCurrency の "native" センチネルはこれとは異なります。これは、ステップ 6a で PoolKey を実際に構築する時点で、Uniswap v4 独自のネイティブ PoolKey 通貨の規約に従い address(0) に解決されます。それより前に解決してはならず、ほかのフィールドに書き込んでもなりません。
デプロイの流れ
公開ガイドで推奨されている順序に沿った7つのステップです。コントラクトによって順序が強制されるのは5つの依存関係のみです( 順序の強制とリバートを参照してください)。 この手順ではガイドの順序に従い、各ステップでその順序が強制されるものか、慣例によるものかを示します。
| ステップ | 説明の参照先 | 概要 |
|---|---|---|
| 1 | 事前確認と検証 | 許可リストチェッカーを確認またはデプロイします |
| 2 | ステップごとの手順 | createPermissionsAdapter |
| 3 | ステップごとの手順 | トークンでアダプターを許可リストに登録し、承認して、depositForVerificationを実行します |
| 4 | ステップごとの手順 | verifyPermissionsAdapter |
| 5 | ステップごとの手順 | 4つのupdateAllowedWrapper登録を行い、その後setAllowedHookを実行します |
| 6 | ステップごとの手順 | プールのinitialize、updateSwappingEnabled、流動性の追加 |
| 7 | ステップごとの手順 | ルーティング許可リストへの登録リクエスト |
ステップごとの手順では、各ステップの前提条件と、コントラクトによって順序が強制される場合は、先に実行したときに返される正確なリバートセレクターを示しています。これは順序の強制とリバートと、セレクター単位で一致します。順序が強制されないステップについては、リバートを作り上げるのではなく、その旨を明記しています。
デプロイ後の検証
一連の手順が完了した後(または各ステップが反映されたことを確認するため、個々のステップの後)に、
セットアップ後の検証チェックリストにある読み取り専用のチェックを実行してください。
そこに記載されたチェックはすべて、公開ゲッターに対するcast callです。いずれもガスを消費せず、上記の確認ゲートも必要ありません。
このフローの実装者向けメモ
- 承認ゲートはステップごとではなく、セッションごとに1回です。 承認を得たら、同じセッション内では再確認せずに残りのステップを続けます。ただし、ユーザーが新しいセッションを開始した場合、チェーンを切り替えた場合、または設定を切り替えた場合は、再度確認してください。
- コントラクトアドレスをハードコードしないでください。 このスキルが使用するアドレスはすべて、読み込んだ設定、手順の実行中にユーザーが指定した値、またはこれら2つのソースのいずれかから取得したアドレスを持つコントラクトに対する読み取り(
cast call)から取得します。このスキルにアドレス一覧が含まれていない理由については、事前確認と検証を参照してください。 - 予期しないリバートは、名前ではなく呼び出し箇所に基づいてデコードしてください。 この手順では、異なる意味を持つ3つのセレクター(
NoVerifiedAdapter、Unauthorized、SwappingDisabled)が、異なるコントラクトで複数回宣言されています。詳しくは、強制される順序とリバートを参照してください。 - このスキルが独自に RPC の状態を取得することはありません。 提案される
cast callはすべて、実行するかどうかをユーザーが選択します。このスキルがバックグラウンドでチェーンをポーリングすることはありません。