关于 permissioned-pools-configurator
用于收集并验证 Uniswap v4 Permissioned Pool 设置参数的交互式技能。它生成供 `permissioned-pools-deployer` 使用的部署前 JSON 配置,不调用合约或广播交易。
主要功能
- 01分四批引导收集参数
- 02按配置架构验证输入
- 03生成 JSON 配置
- 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
详细介绍
权限池配置工具
用于 Uniswap v4 权限池的交互式批量表单配置工具。收集配置流程所需的每个参数,逐一验证,并显示一个 permissioned-pools-deployer 技能可用来执行链上操作的 JSON 配置对象。有关这些参数涉及的合约机制,请参阅 permissioned-pools-issuer。
**运行时兼容性:**此技能使用
AskUserQuestion分批收集参数。如果你的运行时不支持AskUserQuestion,请改用自然语言对话收集相同的参数,保持相同的分组方式,并在每组收集后执行相同的验证。
范围与免责声明
这是一个配置工具,不提供部署指导,也不进行合规审查。
- ✅ 它会收集并验证权限池配置所需的输入,并生成一份 JSON 文档。它不会调用任何合约,不会广播任何内容,也不持有任何签名密钥。
- ✅ 请仅将其视为合约机制说明。此技能不构成法律、财务、投资或税务建议,也不会对你的代币、许可名单、KYC 或 AML 计划或配置进行合规审查。它只说明各参数的含义,以及参数错误会导致什么问题。
- ✅ 它绝不会编造合约地址。你提供的地址会按原样记录;你尚未获取的地址——无论是因为仍需根据部署指南中的表格查找,还是因为发行方尚未决定——都会以字面字符串
"RESOLVE"保存,绝不会猜测或凭记忆填写。 - ✅ 请自行检查生成的配置,并在将其交给部署流程之前,重新解析所有标记为待解析的地址。
- ✅ **请阅读仓库的使用指南。**仓库根目录的
DISCLAIMER.md适用于此仓库中的每项技能:这些技能按原样提供,不附带任何保证;不构成法律、财务、投资或税务建议;并说明了使用限制,以及在使用技能生成财务信息并直接向个人或消费者提供时适用的 AI 披露义务。请向用户指出这一文件。
请在正文中说明这一背景(可引用原文,也可用自己的话表述),并在同一条回复中继续配置流程——这是参考和数据收集内容,并非以行动为导向的部署步骤,因此无需设置确认门槛。部署器技能会在任何需要消耗 Gas 的操作之前要求用户确认。
此配置的作用与局限
输出内容是部署前计划,而不是链上现有内容的记录。
- **
PermissionsAdapter地址不会出现在此配置中。**只有部署器在第 2 步(createPermissionsAdapter)创建它后,该地址才会存在。如果发行方已为此代币部署了适配器,则属于重新运行/导入场景,此技能目前无法处理——请将其地址作为备注收集,并通过部署器技能的部署前检查确认,而不要将其添加到此处。**这只是不接收适配器地址本身,不会阻止处理请求的其余部分。**请继续验证用户提供的(或标记为"RESOLVE"的)所有其他字段,并按照下方流程所述,将其纳入生成的配置。 - **此配置只记录权限代币本身的地址。**请参阅
permissioned-pools-issuer中关于两个地址的区别——部署器稍后创建的池货币是适配器,在部署时推导得出,而非在此处配置。 - Wrapper 和 hook 地址**因链而异,且会随时间变化。**此技能会询问你是否已解析目标链上的这些地址;如果还没有,就会将其标记为待解析,而不是填入某个值。
配置流程
分四批收集参数,每批最多提出四个问题。每批结束后,先根据
config-schema.md 验证每个答案,再继续下一批,并展示已收集内容和待收集内容的最新摘要。每个字段的含义、如何选择值,以及填错后会导致什么问题,均见
parameter-reference.md。
提前回答或跳过后续问题
用户可能会在一条自由格式的消息中回答多批问题,也可能要求跳过剩余问题并立即完成。不要在询问是否继续时扣留整个配置。相反,应根据 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"。显示收集到的四个值的摘要,并标出仍标记为 "RESOLVE" 的字段。
批次 2:验证与核心包装器(4 个问题)
问题 1 — 验证存款金额
- 提示词:“验证时应存入多少底层代币?”
- 选项:“1 wei(推荐)”、自定义金额(通过“其他”)
- 提示词中的说明:此存款将成为适配器可铸造额度,没有提款函数,且 1 wei 已足够——选择更大的金额前,请参阅 参数参考。
- “推荐”表示在被询问并选择时的建议值——如果跳过了此问题,绝不能擅自替用户填入
"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")、自定义地址(通过“其他”) - 提示词中的说明:这是共享的 hook 地址,通过在位置管理器上调用
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)”、自定义(通过“其他”)
- 验证:正整数,以基点的百分之一为单位
- 存储:
pool.feeTier
**验证:**确认剩余的两个包装器字段均为有效地址或字面字符串 "RESOLVE",配对货币为有效的非零地址或字面字符串 "native",且费率档位为正整数。当配对货币是已解析的地址,且 permissionedToken 也是已解析的地址时,确认两者不同 — 将获准使用的代币与自身配对,会构建一个 PoolKey,它要么在 PoolManager 层面失败,要么创建一个无人希望创建的池(参阅参数参考)。展示迄今收集的全部四个包装器、钩子和池货币的摘要,并标出所有仍标记为 "RESOLVE" 的字段。
第 4 批:定价与注入流动性(3 个问题)
问题 1 — Tick 间距
- 提示词:“资金池应使用什么 tick 间距?”
- 选项:“10(类似稳定币的交易对)”、“60(标准)”、“200(宽范围交易对)”、自定义 (通过“其他”填写)
- 验证:正整数
- 存储:
pool.tickSpacing
问题 2 — 起始价格
- 提示词:“资金池的起始价格应是多少?以每个 permissioned-token 对应的配对货币数量表示。”
- 选项:“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",仅显示第二和第三个选项——从列表中完全删除第一个选项, 而不是将其显示为禁用状态。 - 在提示词中注明:无论是注入流动性的钱包,还是接收头寸的钱包,都必须在首次铸造前加入发行方
自己的许可名单并获得
LIQUIDITY_ALLOWED;成为适配器所有者并不会自动获得流动性操作权限。 - 验证:当
intent为"seed-now"时,必须填写wallet,且必须匹配地址正则表达式——绝不能 是字面字符串"RESOLVE"或其他哨兵值;当intent为"none"时,wallet必须为null。 此流程不会生成"seed-later"——该枚举值存在于架构中,供在此流程之外编辑或扩展配置时使用, 不会由这三个选项生成。 - 存储:
seeding.intent、seeding.wallet
**验证:**确认 tick 间距为正整数、起始价格比率为正数,并根据上述选择的分支确认
seeding.wallet 是有效的非 "RESOLVE" 地址(当 intent 为 "seed-now" 时)或为 null
(当 intent 为 "none" 时)。seeding.wallet 绝不接受字面字符串 "RESOLVE",即使原本
打算从 adapterOwner 沿用该值——参见上述选项限制。展示四批收集到的完整配置。
生成并显示配置
将收集到的所有内容组装成 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。
- 底层代币和许可名单检查器模式。
- 适配器所有者。
- 验证保证金金额,并用一句话提醒该金额不可退还。
- 每个包装器和钩子,并分别标记为已解析或需要解析。
- 资金池货币、费率等级、tick 间距、起始价格比率。
- 注入流动性意向和钱包,并提醒该钱包需要
LIQUIDITY_ALLOWED。 - 验证清单:列出
config-schema.md中哪些规则已通过,以及哪些字段仍需要真实地址才能使用此配置部署任何内容。
后续步骤
询问用户想要做什么:
- “保存到文件”——询问文件路径,默认值为
permissioned-pool-config.json。要求使用以.json结尾的相对路径;拒绝绝对路径(以/开头),拒绝以~开头的路径(会展开它的运行时可能在工作目录之外写入文件,包括覆盖 Claude Code 自己的配置存储),并拒绝包含..路径段的路径。解析路径,并在写入前确认它仍位于当前工作目录内。如果解析后的路径已存在,写入前询问用户是否确认覆盖——包括看起来与此技能无关的文件,例如package.json或tsconfig.json。路径被拒绝时,只重新询问一次,不要悄悄替换成默认路径。然后原样写入上方显示的 JSON 对象。(这里的验证有意比此仓库中其他技能的“保存到文件”步骤更严格——拒绝~和..是为了响应一次安全审计的发现:以~开头的路径可能会指向~/.claude.json,因此请保留这些限制,不要删减到与其他较宽松的实现一致。) - “查看设置指南”——指向
permissioned-pools-deployer。 - “修改配置”——重新运行上方相关的批次。
- “退出”——到此结束;用户可以从对话记录中复制 JSON。
此流程的实现者须知
- **绝不要凭记忆填写 token、wrapper、hook 或 adapter-owner 地址。**如果用户未提供某项内容,就在该字段中存入确切的字面字符串
"RESOLVE"——仅此而已。包括不要“好心地”补全只输入了一部分的地址。 - **每次都要批量处理、验证并总结。**不要不经过中间的验证和总结步骤就连续运行全部四个批次;这些步骤可以防止错误输入传播到下一批次的默认值中。
- **此技能不会读取链上状态、获取 RPC,也不会查阅部署 JSON 文件。**它的工具列表中有意不包含
Bash或WebFetch——根据Uniswap/contracts中的deployments/json/<chainId>.json和部署指南的表格解析地址,是用户的工作,或者是部署器技能预检中的后续步骤。