一枚仓位凭证的三种授权面:approve、setApprovalForAll 与 permit 差在哪 图 1
一枚仓位凭证的三种授权面:approve、setApprovalForAll 与 permit 差在哪 · 图 1

集中流动性仓位是一枚 ERC-721 代币,这不是一个实现细节,而是安全边界:既然仓位是 NFT,那么所有 NFT 的授权语义就全都适用于你的资金。做市几个月之后账户里躺着几枚仓位凭证,真正的风险往往不在池子公式,而在你曾经给过谁三种授权中的哪一种。

第一种是单枚授权。标准的 ERC-721 approve 只针对一个 tokenId,被授权方可以动用这一枚仓位——把它取走或者按合约允许的方式操作。它的粒度最细:即使被滥用,损失范围被限定在你点名的那个仓位上。要撤销也是把同一枚的授权指向零地址。缺点是所有仓位都得逐个处理,账户里仓位多时清一遍授权要发多笔交易。

第二种是全系列授权。setApprovalForAll 是对整个合约、也就是全部同类凭证的授权,一个开关管住你在这个仓位管理器名下的所有 tokenId。它的价值在体验:流动性管理工具、金库或交易市场只需你点一次,之后就能代你处理任意一枚仓位。代价是对称的:一旦这个地址变成恶意地址,或者它自身被入侵,攻击者不必再逐个问你要授权,任何一枚新铸出的仓位在它眼里也是可动的。撤销方式是把这个 operator 标志关掉,注意它是按操作者关,而不是按某枚仓位关。

第三种是 permit 签名。仓位管理器实现了 ERC-721Permit,允许你用一条链下签名代替一笔 approve 交易:签名里带着 tokenId、审批地址、一个单调递增的 nonce 和到期时间,签名一旦被提交到合约,效果等同于对这枚仓位的单枚授权,并且该 tokenId 的 nonce 前进一格。它省一次交易、省一次燃料,也是聚合器把加入流动性打包成一步的技术底座。风险点则集中在两点:一是签名可能被拿去认证身份或当作登录签名使用,一旦签了就等于授权;二是 nonce 前移的副作用——同一个 tokenId 的旧签名会失效,而不同 tokenId 的 nonce 各自独立,所以别指望用一个 nonce 让所有历史签名一起作废。

三种授权的作用半径差异,决定了清理顺序。合约层面它们互相独立:关掉全系列授权不会抹掉某枚仓位上残留的单枚授权,permit 提交过的效果也落在单枚授权这一层。所以在做账户卫生时,不能只看某一站管理器的授权就放心。合理的读法是从仓位 NFT 合约出发,逐枚查 getApproved,再逐地址查 isApprovedForAll,把仍在生效的操作者列成一张表,比对着你还打算用的工具名单一个个关掉。

还有一个容易被忽略的结构性事实:仓位 NFT 的所有权和操作能力是两条线。转让 NFT 会把仓位连同未领取的手续费一起交给新持有人,但未领取的手续费只有在持有人调用提取之后才能被转走——仓位管理器在销毁记录前会检查这枚仓位的流动性和应计资产都已被清空,因此把 NFT 转给别人等于把未领手续费一并转了。做场外协议承接仓位时,这一步必须写进流程:先由卖方领取费用、再转让,或在条款里明确费用归谁。

最后一层边界来自组合交易。仓位管理器支持批量调用,一次交易里可以塞进加流动性和领取等多步动作,任何一步失败整笔回滚,这让授权与操作被压缩在同一时刻完成,也意味着你在一个界面上点一次确认,实际可能同时发生了授权、铸仓与授权回收三件事。要判断点的是什么,只能回到模拟出来的调用列表,而不是界面文案。

把上面几条压缩成一份自查顺序:先列出你所有仓位凭证的合约地址,逐枚查单枚授权;再查全系列授权的操作者清单,关掉不再使用的;然后回忆是否给过任何登录即签的消息,那类签名可能就是 permit;最后把每枚仓位的未领手续费清一遍,让即便被转手也带不走资产。这套顺序不需要预测价格,也不依赖任何工具评分,做的只有一件事——把权限半径和当下的使用需求对齐。

本文只讨论合约授权机制与账户操作,不构成收益承诺,本文内容不构成投资建议;授权与转让操作可能导致资产损失,操作前请核对合约与官方文档并自担风险。

一枚仓位凭证的三种授权面:approve、setApprovalForAll 与 permit 差在哪 图 2
一枚仓位凭证的三种授权面:approve、setApprovalForAll 与 permit 差在哪 · 图 2