permissioned-pools-configurator
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePermissioned Pools Configurator
Uniswap v4许可池配置工具
Interactive bulk-form configurator for a Uniswap v4 Permissioned Pool. Collects every
parameter the setup journey needs, validates each one, and displays a single JSON
configuration object that the skill consumes to run the
on-chain sequence. For the contract mechanics behind any of these parameters, see
.
permissioned-pools-deployerpermissioned-pools-issuerRuntime Compatibility: This skill usesto collect parameters in batches. IfAskUserQuestionis not available in your runtime, collect the same parameters through natural language conversation instead, in the same batch groupings and with the same validation after each group.AskUserQuestion
这是一款用于Uniswap v4许可池(Permissioned Pool)的交互式批量表单配置工具。它会收集部署流程所需的所有参数,逐一验证,并生成一个JSON配置对象,供技能执行链上部署流程使用。如需了解这些参数背后的合约机制,请查看。
permissioned-pools-deployerpermissioned-pools-issuer运行时兼容性: 本技能使用批量收集参数。如果你的运行环境不支持AskUserQuestion,请通过自然语言对话收集相同参数,遵循相同的分组批次,并在每组参数收集后进行相同的验证。AskUserQuestion
Scope and Disclaimer
范围与免责声明
This is a configuration tool, not deployment guidance and not a compliance review.
- ✅ It collects and validates the inputs a permissioned-pool setup needs and produces a JSON document. It does not call any contract, does not broadcast anything, and holds no signing keys.
- ✅ Treat this as contract mechanics only. This skill does not constitute legal, financial, investment, or tax advice, and it is not a compliance review of your token, your allowlist, your KYC or AML program, or your configuration. It covers what each parameter means and what breaks if it is wrong.
- ✅ It never invents a contract address. Addresses you supply are recorded as given;
addresses you do not yet have — whether because they still need to be looked up
against the deploy guide's table or because the issuer has not decided on them yet —
are stored as the literal string , never guessed or recalled from memory.
"RESOLVE" - ✅ Review the emitted configuration yourself, and re-resolve every address it marks for resolution, before handing it to a deployment flow.
- ✅ Read the repo's usage guidelines. The repo root governs every skill in this repository: they are provided as is without warranty, they do not constitute legal, financial, investment, or tax advice, and it sets out use limits plus an AI-disclosure duty that applies when you use a skill to generate financial information and present it directly to individuals or consumers. Point the user to it.
DISCLAIMER.md
State this framing inline (quoted or in your own words) and continue with the
configuration flow in the same response — this is reference and data-collection
content, not an action-oriented deployment step, so no acknowledgment gate is needed
here. The deployer skill gates on acknowledgment before anything gas-spending.
这是一款配置工具,而非部署指南或合规审查工具。
- ✅ 它收集并验证许可池部署所需的输入,生成JSON文档。它不会调用任何合约、不会广播任何内容,也不持有签名密钥。
- ✅ 仅将其视为合约机制相关工具。 本技能不构成法律、财务、投资或税务建议,也不对你的代币、白名单、KYC/AML程序或配置进行合规审查。它仅解释每个参数的含义以及参数错误会导致的问题。
- ✅ 它绝不会凭空生成合约地址。你提供的地址将按原样记录;如果你尚未拥有某些地址——无论是因为需要对照部署指南表格查找,还是发行方尚未确定——这些地址将被存储为字面字符串,绝不会猜测或从记忆中调取。
"RESOLVE" - ✅ 在将生成的配置交给部署流程之前,请自行审核该配置,并重新解析所有标记为待解析的地址。
- ✅ 阅读仓库的使用指南。 仓库根目录的管辖本仓库中的所有技能:它们按“原样”提供,不提供任何担保,不构成法律、财务、投资或税务建议,并规定了使用限制以及当你使用技能生成财务信息并直接呈现给个人或消费者时需履行的AI披露义务。请引导用户查看该文档。
DISCLAIMER.md
请在回复中直接说明上述框架(可引用原文或用自己的话表述),并继续配置流程——这是参考和数据收集内容,而非面向操作的部署步骤,因此无需确认环节。部署技能会在执行任何消耗gas的操作前要求用户确认。
What This Config Is (and Isn't)
本配置的本质(与非本质)
The output is a pre-deployment plan, not a record of what already exists on-chain.
- The address does not appear in this config. It does not exist until the deployer's Step 2 (
PermissionsAdapter) creates it. If the issuer already has a deployed adapter for this token, that is a re-run/import scenario this skill does not currently handle — collect its address as a note and confirm with the deployer skill's preflight checks instead of adding it here. This declines only the adapter address itself — it does not block the rest of the request. Continue validating and including every other field the user supplied (or markedcreatePermissionsAdapter) in the emitted configuration exactly as the flow below describes."RESOLVE" - The underlying permissioned token is the only token address this config records.
See the two-addresses distinction in — the pool currency the deployer builds later is the adapter, derived at deploy time, not configured here.
permissioned-pools-issuer - Wrapper and hook addresses are chain-specific and change over time. This skill asks whether you already have them resolved for your target chain; if not, it marks them for resolution rather than filling in a value.
输出结果是一份部署前计划,而非链上已存在内容的记录。
- 地址不会出现在本配置中。 它要到部署流程的第2步(
PermissionsAdapter)才会创建。如果发行方已经为该代币部署了适配器,这属于重新运行/导入场景,本技能目前不支持处理——请将其地址作为备注收集,并通过部署技能的预检步骤确认,而非添加到本配置中。仅排除适配器地址本身——不阻止请求的其余部分。 请继续按照以下流程描述,验证并包含用户提供的(或标记为createPermissionsAdapter的)所有其他字段。"RESOLVE" - 本配置仅记录底层许可代币的地址。 请查看中的双地址区分说明——部署流程后续构建的池代币是适配器,在部署时生成,而非在此处配置。
permissioned-pools-issuer - 包装器和钩子地址是链特定的,且会随时间变化。本技能会询问你是否已针对目标链解析了这些地址;如果没有,则标记为待解析,而非填充值。
Configuration Flow
配置流程
Collect parameters in four batches of at most four questions each. After each batch,
validate every answer against before
moving on, and show a running summary of what has been collected and what remains.
Field-by-field meaning, how to choose each value, and what breaks if it is wrong are all
in .
config-schema.mdparameter-reference.md将参数分为四组,每组最多四个问题。每组参数收集完成后,对照验证每个答案,然后再进行下一组,并显示已收集和待收集参数的实时汇总。每个字段的含义、如何选择值以及参数错误会导致的问题均记录在中。
config-schema.mdparameter-reference.mdFront-loaded or skip-ahead answers
提前回答或跳过后续问题
A user may answer several batches' worth of questions in one free-form message, or ask
to skip the remaining questions and finish immediately. Do not withhold the whole
configuration while asking whether to proceed. Instead: validate everything the user did
supply against , apply the literal string (or for
when the checker is ) to every address-type
field left open, and produce that partial configuration in the same response. Fields with
no sentinel — the verification deposit amount, pool currency, fee tier, tick
spacing, starting price, and seeding — have no safe default; flag each one explicitly as
still needing an answer rather than guessing at it, and ask only about those. This
includes the verification deposit amount even though Batch 2 lists "1 wei" as the
recommended option: a menu option a user has not actually picked is not a value the
skill may silently apply on their behalf — treat an unanswered verification deposit
amount exactly like the other sentinel-less fields, never as an already-resolved .
Skipping the batch-by-batch confirmation step never means skipping validation — every
rule above still applies to whatever the user did supply.
config-schema.md"RESOLVE"nullallowlistChecker.addressto-be-deployed"RESOLVE""1"用户可能在一条自由格式消息中回答多组问题,或要求跳过剩余问题立即完成。不要因询问是否继续而 withholding 完整配置。相反:对照验证用户提供的所有内容,对每个未填写的地址类型字段应用字面字符串(或当检查器为时,设为),并在同一回复中生成该部分配置。没有标记的字段——验证押金金额、池代币、费率层级、tick间距、起始价格和流动性注入——没有安全默认值;请明确标记每个此类字段仍需回答,而非猜测值。这包括验证押金金额,即使第2组列出了“1 wei”作为推荐选项: 用户未实际选择的菜单选项不能作为技能自动应用的值——未回答的验证押金金额应与其他无标记字段完全相同处理,绝不能视为已解析的。跳过组间确认步骤绝不意味着跳过验证——上述所有规则仍适用于用户提供的任何内容。
config-schema.md"RESOLVE"to-be-deployedallowlistChecker.addressnull"RESOLVE""1"Batch 1: Network, Token & Ownership (4 questions)
第1组:网络、代币与所有权(4个问题)
Question 1 — Network
- Prompt: "Which network is this permissioned pool for?"
- Options: "Ethereum Mainnet (chain ID 1)", "Unichain (chain ID 130)", "Sepolia (chain ID 11155111)", Custom chain ID (via "Other")
- Note in the prompt: availability of the permissioned-pools contracts on a given chain is
not something this skill asserts — confirm the chain has a row in the deploy guide's
table before proceeding.
#deployment-addresses - Store:
chainId
Question 2 — Underlying permissioned token
- Prompt: "What is the address of the permissioned ERC-20 being listed?"
- Options: "Not deployed yet" (stores the literal string ), custom address (via "Other")
"RESOLVE" - Validation: , or the literal string
^0x[a-fA-F0-9]{40}$if not yet deployed"RESOLVE" - Store:
permissionedToken
Question 3 — Allowlist checker
- Prompt: "Do you already have an allowlist checker deployed for this token?"
- Options, each mapped to the exact value it produces:
allowlistChecker- "Yes, use an existing address" (then ask for the address via "Other") →
,
mode: "existing"set to that address.address - "No, I still need to deploy one" → ,
mode: "to-be-deployed"set toaddress.null
- "Yes, use an existing address" (then ask for the address via "Other") →
- Validation: address form above when "existing" is chosen
- Store: (
allowlistChecker.mode|existing),to-be-deployedallowlistChecker.address
Question 4 — Adapter owner
- Prompt: "What address should own the (
PermissionsAdapter)?"initialOwner - Options: "Not yet decided — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Note in the prompt: this key can change the allowlist checker, add or remove wrappers, pause and resume swapping, and force-exit any LP position — the published guide recommends a multisig. Do not pick this in a hurry just to finish the flow; use the resolution marker instead if the multisig or key is not decided yet.
- Validation: and not the zero address, or the literal string
^0x[a-fA-F0-9]{40}$"RESOLVE" - Store:
adapterOwner
Validate: confirm chain ID is a positive integer, the token address is either a
valid address or the literal string , the checker address (if "existing" was
chosen) matches the address regex, and the adapter owner is either a valid non-zero
address or the literal string . Show a summary of the four collected values,
flagging any field still marked .
"RESOLVE""RESOLVE""RESOLVE"问题1 — 网络
- 提示:“该许可池针对哪个网络?”
- 选项:“以太坊主网(chain ID 1)”、“Unichain(chain ID 130)”、“Sepolia(chain ID 11155111)”、自定义chain ID(通过“其他”选项)
- 提示说明:本技能不保证许可池合约在特定网络上可用——请先确认该网络在部署指南的表格中有对应行,再继续。
#deployment-addresses - 存储:
chainId
问题2 — 底层许可代币
- 提示:“待上线的许可ERC-20代币地址是什么?”
- 选项:“尚未部署”(存储为字面字符串)、自定义地址(通过“其他”选项)
"RESOLVE" - 验证:符合格式,或如果尚未部署则为字面字符串
^0x[a-fA-F0-9]{40}$"RESOLVE" - 存储:
permissionedToken
问题3 — 白名单检查器
- 提示:“你是否已为该代币部署了白名单检查器?”
- 选项,每个选项映射到其生成的精确值:
allowlistChecker- “是,使用现有地址”(然后通过“其他”选项询问地址)→ ,
mode: "existing"设为该地址。address - “否,我仍需部署一个” → ,
mode: "to-be-deployed"设为address。null
- “是,使用现有地址”(然后通过“其他”选项询问地址)→
- 验证:选择“现有”时,地址需符合上述格式
- 存储:(
allowlistChecker.mode|existing)、to-be-deployedallowlistChecker.address
问题4 — 适配器所有者
- 提示:“的所有者地址(
PermissionsAdapter)应该是什么?”initialOwner - 选项:“尚未决定——标记为待解析”(存储为字面字符串)、自定义地址(通过“其他”选项)
"RESOLVE" - 提示说明:该地址可以更改白名单检查器、添加或移除包装器、暂停和恢复交易、强制退出任何流动性提供者(LP)头寸——发布的指南推荐使用多签地址。不要为了完成流程而仓促选择该地址;如果多签或密钥尚未确定,请使用解析标记。
- 验证:符合格式且不为零地址,或为字面字符串
^0x[a-fA-F0-9]{40}$"RESOLVE" - 存储:
adapterOwner
验证: 确认chain ID为正整数,代币地址为有效地址或字面字符串,检查器地址(如果选择“现有”)符合地址正则,适配器所有者为有效非零地址或字面字符串。显示已收集的四个值的汇总,标记仍为的字段。
"RESOLVE""RESOLVE""RESOLVE"Batch 2: Verification & Core Wrappers (4 questions)
第2组:验证与核心包装器(4个问题)
Question 1 — Verification deposit amount
- Prompt: "How much of the underlying token should be deposited for verification?"
- Options: "1 wei (recommended)", Custom amount (via "Other")
- Note in the prompt: this deposit becomes the adapter's mintable headroom, there is no withdraw function, and 1 wei is sufficient — see Parameter Reference before choosing anything larger.
- "Recommended" describes the value if asked and picked — it is never a license to fill
in on the user's behalf when this question was skipped. See Front-loaded or skip-ahead answers above.
"1" - Store:
verificationDepositAmount
Question 2 — address
PermissionedPositionManager- Prompt: "Do you have the address resolved for this chain?"
PermissionedPositionManager - Options: "Not yet resolved — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Validation: address form, or the literal string
"RESOLVE" - Store:
allowedWrappers.permissionedPositionManager
Question 3 — Universal Router (v2.2+) address
- Prompt: "Do you have the Universal Router (or higher) address resolved for this chain?"
#v2.2 - Options: "Not yet resolved — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Note in the prompt: the plain deployments key is a different, non-permissioned router — only the
UniversalRouterdeployment works here.#v2.2 - Validation: address form, or the literal string
"RESOLVE" - Store:
allowedWrappers.universalRouterV2_2
Question 4 — address
PermissionedHooks- Prompt: "Do you have the address resolved for this chain, for
PermissionedHooks?"setAllowedHook - Options: "Not yet resolved — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Note in the prompt: this is the shared hook address, registered with
on the position manager — it is never registered as a wrapper.
setAllowedHook - Validation: address form, or the literal string
"RESOLVE" - Store:
hook
Validate: confirm the deposit amount is a positive integer (not zero) expressed in
the token's smallest unit, and that every address field is either a valid address or the
literal string — never a guessed or invented value. Show a summary.
"RESOLVE"问题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- 提示:“你是否已针对该链解析了地址,用于
PermissionedHooks?”setAllowedHook - 选项:“尚未解析——标记为待解析”(存储为字面字符串)、自定义地址(通过“其他”选项)
"RESOLVE" - 提示说明:这是共享钩子地址,在头寸管理器上通过注册——绝不会作为包装器注册。
setAllowedHook - 验证:符合地址格式,或为字面字符串
"RESOLVE" - 存储:
hook
验证: 确认押金金额为正整数(非零),以代币最小单位表示,且每个地址字段为有效地址或字面字符串——绝不能是猜测或凭空生成的值。显示汇总。
"RESOLVE"Batch 3: Remaining Wrappers & Pool Currency (4 questions)
第3组:剩余包装器与池代币(4个问题)
Question 1 — address
V4Quoter- Prompt: "Do you have the address resolved for this chain?"
V4Quoter - Options: "Not yet resolved — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Validation: address form, or the literal string
"RESOLVE" - Store:
allowedWrappers.v4Quoter
Question 2 — address
MixedRouteQuoterV2- Prompt: "Do you have the address resolved for this chain?"
MixedRouteQuoterV2 - Options: "Not yet resolved — mark for resolution" (stores the literal string
), custom address (via "Other")
"RESOLVE" - Validation: address form, or the literal string
"RESOLVE" - Store:
allowedWrappers.mixedRouteQuoterV2
Question 3 — Paired currency
- Prompt: "What currency should the pool pair against the permissioned token?"
- Options: "Native ETH", custom ERC-20 address (via "Other")
- Note in the prompt: the permissioned token's side of the pool is always the adapter, never the underlying token — this question is only about the other currency.
- Validation: address form for an ERC-20 and not the zero address, or the literal string
(the native-currency sentinel; see Address Validation for the full semantics). A user who supplies the zero address here means
"native"— record"native", never the zero address."native" - Store:
pool.pairedCurrency
Question 4 — Fee tier
- Prompt: "What fee tier should the pool use?"
- Options: "0.05% (500)", "0.30% (3000)", "1.00% (10000)", Custom (via "Other")
- Validation: positive integer, hundredths of a basis point
- Store:
pool.feeTier
Validate: confirm both remaining wrapper fields are a valid address or the literal
string , the paired currency is a valid non-zero address or the literal string
, and the fee tier is a positive integer. When the paired currency is a resolved
address and is also a resolved address, confirm the two differ —
pairing the permissioned token against itself builds a that either fails at the
PoolManager level or creates a pool nobody intended (see
Parameter Reference). Show a
summary of all four wrappers,
the hook, and the pool currency collected so far, and flag every field still marked
.
"RESOLVE""native"permissionedTokenPoolKey"RESOLVE"问题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
验证: 确认剩余两个包装器字段为有效地址或字面字符串,配对代币为有效非零地址或字面字符串,费率层级为正整数。当配对代币为已解析地址且也为已解析地址时,确认两者不同——许可代币与自身配对会生成,要么在PoolManager层面失败,要么创建非预期的池(请查看参数参考)。显示已收集的所有四个包装器、钩子和池代币的汇总,并标记仍为的字段。
"RESOLVE""native"permissionedTokenPoolKey"RESOLVE"Batch 4: Pricing & Seeding (3 questions)
第4组:定价与流动性注入(3个问题)
Question 1 — Tick spacing
- Prompt: "What tick spacing should the pool use?"
- Options: "10 (stable-like pairs)", "60 (standard)", "200 (wide-range pairs)", Custom (via "Other")
- Validation: positive integer
- Store:
pool.tickSpacing
Question 2 — Starting price
- Prompt: "What should the pool's starting price be, expressed as paired-currency per permissioned-token?"
- Options: "1:1 (equal value ratio)", Custom ratio (via "Other")
- Validation: positive number
- Store: (a human-readable ratio; the deployer skill converts this to
pool.startingPriceRatioat initialization time, since that conversion depends on the decimals of both currencies, which are not yet resolved at configuration time)sqrtPriceX96
Question 3 — Seeding intent
- Prompt: "Do you plan to seed liquidity as part of this same setup?"
- Options, each mapped to the exact value it produces:
seeding.intent- "Yes, from the adapter owner's wallet" → ,
intent: "seed-now"set to the same address already collected aswalletin Batch 1. Offer this option only whenadapterOwneris a real address — not when it is the literal stringadapterOwner."RESOLVE"must always be a real address (see Validation below), so this option cannot copy forward an unresolved owner.seeding.wallet - "Yes, from a different wallet" (then ask for the address via "Other") →
,
intent: "seed-now"set to that addresswallet - "Not yet — pool creation only" → ,
intent: "none"wallet: null
- "Yes, from the adapter owner's wallet" →
- If is
adapterOwner, present only the second and third options — drop the first option from the list entirely rather than showing it disabled."RESOLVE" - Note in the prompt: whichever wallet seeds liquidity, and the wallet that will receive
the position, both need on the issuer's own allowlist before the first mint — being the adapter owner grants nothing on the liquidity path.
LIQUIDITY_ALLOWED - Validation: when is
intent,"seed-now"is required and must match the address regex — never the literal stringwalletor any other sentinel; when"RESOLVE"isintent,"none"must bewallet. This flow never producesnull— that enum value exists in the schema for a config edited or extended outside this flow, not for output from these three options."seed-later" - Store: ,
seeding.intentseeding.wallet
Validate: confirm tick spacing is a positive integer, the starting price ratio is a
positive number, and — per the branch taken above — either is a valid,
non- address (when is ) or it is (when is
). never accepts the literal string , even when it
was going to be copied from — see the option restriction above. Show the
full configuration collected across all four batches.
seeding.wallet"RESOLVE"intent"seed-now"nullintent"none"seeding.wallet"RESOLVE"adapterOwner问题1 — Tick间距
- 提示:“池应使用哪种tick间距?”
- 选项:“10(类稳定币配对)”、“60(标准)”、“200(宽范围配对)”、自定义(通过“其他”选项)
- 验证:正整数
- 存储:
pool.tickSpacing
问题2 — 起始价格
- 提示:“池的起始价格应为多少,以配对代币/许可代币表示?”
- 选项:“1:1(等值比例)”、自定义比例(通过“其他”选项)
- 验证:正数
- 存储:(人类可读比例;部署技能会在初始化时将其转换为
pool.startingPriceRatio,因为转换依赖两种代币的小数位数,而这些在配置时尚未解析)sqrtPriceX96
问题3 — 流动性注入意图
- 提示:“你是否计划在本次设置中注入流动性?”
- 选项,每个选项映射到其生成的精确值:
seeding.intent- “是,使用适配器所有者的钱包” → ,
intent: "seed-now"设为第1组中已收集的wallet地址。仅当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——该枚举值存在于schema中是为了供本流程之外编辑或扩展的配置使用,而非本流程的输出。"seed-later" - 存储:、
seeding.intentseeding.wallet
验证: 确认tick间距为正整数,起始价格比例为正数,且——根据所选分支——要么为有效且非的地址(当为时),要么为(当为时)。绝不接受字面字符串,即使它将从复制——请参阅上方选项限制。显示所有四组收集的完整配置。
seeding.wallet"RESOLVE"intent"seed-now"nullintent"none"seeding.wallet"RESOLVE"adapterOwnerGenerate and Display the Configuration
生成并显示配置
Assemble everything collected into the JSON shape defined in
, keyed by at the top
level:
config-schema.mdchainIdjson
{
"<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": "..." }
}
}Display this JSON directly in the transcript. Do not automatically create a file.
Let the user copy it or choose a filepath in the next-steps question below.
将收集到的所有内容组装成中定义的JSON结构,顶层以为键:
config-schema.mdchainIdjson
{
"<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。不要自动创建文件。 让用户复制它,或在后续问题中选择文件路径。
Display Summary
显示汇总
Immediately after the JSON, show a human-readable summary:
- Network and chain ID.
- Underlying token and allowlist-checker mode.
- Adapter owner.
- Verification deposit amount, with a one-line reminder that it is not recoverable.
- Every wrapper and the hook, each flagged resolved or needs resolution.
- Pool currency, fee tier, tick spacing, starting price ratio.
- Seeding intent and wallet, with a reminder that the wallet needs .
LIQUIDITY_ALLOWED - A validation checklist: which rules from passed, and which fields still need a real address before this config can be used to deploy anything.
config-schema.md
在JSON之后立即显示人类可读的汇总:
- 网络和chain ID。
- 底层代币和白名单检查器模式。
- 适配器所有者。
- 验证押金金额,并附带一行提醒:该金额不可追回。
- 每个包装器和钩子,标记为已解析或待解析。
- 池代币、费率层级、tick间距、起始价格比例。
- 流动性注入意图和钱包,并提醒该钱包需要权限。
LIQUIDITY_ALLOWED - 验证清单:中的哪些规则已通过,哪些字段仍需真实地址才能用于部署。
config-schema.md
Next Steps
后续步骤
Ask the user what they want to do:
- "Save to file" — ask for a filepath, default . Require a relative path ending in
permissioned-pool-config.json; reject an absolute path (leading.json), reject a leading/(a runtime that expands it can write outside the working directory — including over Claude Code's own config store), and reject any path containing a~segment. Resolve the path and confirm it still stays within the current working directory before writing. If the resolved path already exists, ask for confirmation before overwriting it — including a file that looks unrelated to this skill, such as..orpackage.json. Re-prompt once on a rejected path rather than silently substituting the default. Then write exactly the JSON object shown above. (This validation is intentionally stricter than other skills' "save to file" steps in this repo — thetsconfig.jsonand~rejections were added in response to a security audit finding that a leading..could target~, so keep them here rather than trimming to match a lighter-weight equivalent elsewhere.)~/.claude.json - "View the setup walkthrough" — point at .
permissioned-pools-deployer - "Modify configuration" — re-run the relevant batch above.
- "Exit" — end here; the user can copy the JSON from the transcript.
询问用户想要执行的操作:
- “保存到文件”——询问文件路径,默认。要求使用以
permissioned-pool-config.json结尾的相对路径;拒绝绝对路径(以.json开头)、拒绝以/开头的路径(此类路径可能被运行时扩展到工作目录之外——包括覆盖Claude Code自身的配置存储),拒绝包含~段的路径。解析路径并确认其仍在当前工作目录内,然后再写入。如果解析后的路径已存在,在覆盖前请确认——包括与本技能无关的文件,如..或package.json。对被拒绝的路径重新提示一次,而非自动替换为默认路径。然后写入上述显示的JSON对象。(此处的验证故意比本仓库中其他技能的“保存到文件”步骤更严格——添加tsconfig.json和~的拒绝规则是为了响应安全审计发现:以..开头的路径可能指向~,请在此处保留这些规则,不要简化为更轻量的等效规则。)~/.claude.json - “查看部署指南”——指向。
permissioned-pools-deployer - “修改配置”——重新运行相关组的问题。
- “退出”——结束流程;用户可从对话中复制JSON。
Notes for Implementers of This Flow
本流程实现者注意事项
- Never fill in a token, wrapper, hook, or adapter-owner address from memory. If the
user does not supply one, store the exact literal string in that field — full stop. This includes not "helpfully" completing a partially-typed address.
"RESOLVE" - Batch, validate, summarize — every time. Do not run all four batches back to back without the validation and summary steps in between; that is what keeps a bad input from propagating into the next batch's defaults.
- This skill does not read chain state, fetch an RPC, or consult a deployments JSON
file. It has no or
Bashin its tool list, on purpose — resolving addresses againstWebFetchUniswap/contractsand the deploy guide's table is the user's job, or a later step in the deployer skill's preflight.deployments/json/<chainId>.json
- 绝不要从记忆中填充代币、包装器、钩子或适配器所有者地址。 如果用户未提供地址,在该字段中存储精确的字面字符串——仅此而已。这包括不要“善意地”补全部分输入的地址。
"RESOLVE" - 分组、验证、汇总——每次都要执行。 不要连续运行四组问题而没有中间的验证和汇总步骤;这可以防止错误输入传播到下一组的默认值中。
- 本技能不会读取链状态、获取RPC或查询deployments JSON文件。 其工具列表中有意不包含或
Bash——对照WebFetch的Uniswap/contracts和部署指南表格解析地址是用户的工作,或部署技能预检步骤中的后续操作。deployments/json/<chainId>.json