许可池只对"通过发行方身份验证的地址"开放,普通 Uniswap 用户无法直接交易或添加流动性。如果你在 Uniswap 上尝试与一个许可池交互但地址不在白名单内,交易会直接失败并可能浪费 Gas。这篇文章把白名单获取、交易路径和退出限制拆开讲清楚。
先搞清楚你面对的是哪种"许可"
Uniswap v4 的许可池(Permissioned Pools)建立在 hook 机制上。池子本身挂在 Uniswap v4 的 PoolManager 下,但额外挂载了一个 PermissionedHooks,在每次 swap 和添加流动性前检查你的地址是否持有对应权限。
这里有两个互相独立的权限标志:
| 权限标志 | 含义 | 对应的操作 |
|---|---|---|
SWAP_ALLOWED | 允许在池中交换代币 | 买入/卖出 |
LIQUIDITY_ALLOWED | 允许提供流动性 | 添加/增加 LP 仓位 |
两个标志分开设置。一个地址可以只有交换权限而没有流动性权限。如果你打算做市,需要确认自己拿到的是 LIQUIDITY_ALLOWED,而不是想当然地认为"能交易就能做 LP"。
一个地址不在白名单上,任何操作都会被 hook 拒绝。 Uniswap 官方文档明确说明:beforeSwap 会检查 SWAP_ALLOWED,beforeAddLiquidity 会检查 LIQUIDITY_ALLOWED,没有对应权限的交易直接 revert。这不是前端拦截,而是链上合约层面的拒绝,换任何界面都无法绕过。
白名单从哪里来,怎么知道自己有没有
白名单由发行方(或发行方指定的运营方)维护,不是 Uniswap 官方维护。发行方自行部署一个 IAllowlistChecker 合约,通过标准接口返回某个地址的权限标志。Uniswap 协议本身不参与身份审核,也不接触 KYC 文件。
你无法在链上"申请"白名单。 权限的授予发生在链下流程中——发行方或其指定的 KYC 服务商完成验证后,将你的地址写入 checker 合约。Uniswap 的 API 提供了一个 check permissions 端点,可以在交易前查询某个钱包是否对某个代币有权限。如果你在集成 Uniswap API 的应用里操作,前端可能已经内置了这个预检;如果预检返回 isAllowlisted: false,结果里会带一个 kycUrl,指向发行方指定的验证入口。
如果你不知道自己的地址在不在白名单上,最直接的方法是找到该许可池对应的发行方页面或公告,查看他们提供的 allowlist checker 地址,然后在区块浏览器上调用 checkAllowlist(你的地址) 查看返回值。权限以位标志表示,1 代表 SWAP_ALLOWED,2 代表 LIQUIDITY_ALLOWED。
交易路径:为什么不能直接调 Uniswap 界面
许可池的 swap 不能通过标准的 PoolManager 直接完成。整个流程中,实际进入池子交易的不是你持有的那个代币本身,而是一个由 PermissionsAdapter 合约创建的"虚拟代币"。
流程大致如下:
你通过 Universal Router(必须使用 2.2.0 或更高版本)发起 swap;
Router 将你的底层许可代币转入
PermissionsAdapter;Adapter 持有底层代币,并在 PoolManager 中创建一个虚拟余额;
PoolManager 用这个虚拟余额执行 swap;
PermissionedHooks.beforeSwap检查你的地址是否有SWAP_ALLOWED;交易完成后,虚拟代币被转换回底层代币,发送给你。
你全程不需要手动管理虚拟代币,Router 会自动处理。但这也意味着你必须通过支持许可池路由的界面或合约来操作。标准 Uniswap 界面如果未集成许可池的预检和路由逻辑,你的交易会直接 revert。
退出限制:仓位不能转让,但你可以随时自己撤出
许可池的 LP 仓位以 NFT 形式表示,这个 NFT 不可转让。调用 transferFrom 或 safeTransferFrom 会 revert,错误信息是 TransferDisabled。设计目的是防止已通过验证的地址把仓位转给未验证地址,从而绕过白名单。
但"不可转让"不等于"不能退出"。减少流动性和销毁仓位始终不受权限检查限制。即使你之后失去了 LIQUIDITY_ALLOWED 权限,或者发行方撤销了 hook,你仍然可以调用 DECREASE_LIQUIDITY 或 BURN_POSITION 取出自己的资产。Uniswap 文档明确写了这一点:decreases and burns are never gated, so you can always withdraw。
发行方有强制撤仓的权力。 PermissionsAdapter 的管理员(通常是发行方或其运营方)可以调用 unwindPosition(tokenId) 强制关闭任何一个 LP 仓位。这个操作会销毁 NFT、移除流动性,然后把资产返还给持有人。如果持有人已经无法接收某种资产,那部分资产会退还给对应资产的发行方,而不会落到另一个发行方手里。
这意味着你作为 LP 需要接受一个前提:你随时可能被发行方强制退出仓位,即使你当时仍然在白名单上。这不是漏洞,而是面向受监管资产的刻意设计。在决定提供流动性之前,应该像读基金条款一样阅读发行方的 allowlist 政策,确认 unwind 的触发条件。
常见卡点
交易一直失败,提示权限不足。 你的地址没有 SWAP_ALLOWED,或者发行方暂停了交易(updateSwappingEnabled 被设为 false)。先确认自己的白名单状态,再确认发行方是否处于暂停状态。
想给许可池加流动性,但交易 revert。 最常见的原因是只有 SWAP_ALLOWED 而没有 LIQUIDITY_ALLOWED。另一个可能的原因是池子的 PermissionedHooks 尚未被 Adapter 管理员通过 updateAllowedHook 加入允许列表,这种情况下任何 mint 都会 revert。
LP 仓位在钱包里看不到。 许可池的仓位 NFT 由 PermissionedPositionManager 管理,而不是标准的 PositionManager。如果你的钱包或投资组合追踪工具只索引标准 PositionManager 的合约,可能不会自动显示这个 NFT。需要手动添加合约地址来查看。
被 unwind 之后资产去哪了。 如果被发行方强制撤仓,底层资产会直接退回你的地址。你可以在区块浏览器上查看该 unwindPosition 交易的具体转账记录来确认到账情况。如果资产没有正常返还,检查你当前是否仍有权接收该资产——如果发行方已把你从 allowlist 移除,资产会退还给发行方。



