mcpField
P
permissioned-pools-configurator

permissioned-pools-configurator

github.com/uniswap开发236245 次安装2 天前更新
代码仓库

关于 permissioned-pools-configurator

用于收集并验证 Uniswap v4 Permissioned Pool 设置参数的交互式技能。它生成供 `permissioned-pools-deployer` 使用的部署前 JSON 配置,不调用合约或广播交易。

主要功能

  1. 01分四批引导收集参数
  2. 02按配置架构验证输入
  3. 03生成 JSON 配置
  4. 04未解析地址标记为 `RESOLVE`
  5. 05不调用合约或签署交易

适用场景

  1. 01为部署工作流准备池参数
  2. 02记录仍待解析的地址
  3. 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。
  • 验证:选择“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 和部署指南的表格解析地址,是用户的工作,或者是部署器技能预检中的后续步骤。

评论

支持 Markdown