委托代理规则
GroupDelegate 维护的是一份“groupId -> delegate groupId”的附加记录。
它的作用是让某个 GroupNFT 的当前持有人把应用代理权委托给另一个 GroupNFT 的当前持有人。委托不改变 NFT 所有权,也不转移资产、收益或默认身份。
基本规则
- 只有
groupId的当前 owner 可以设置 delegate。 delegateId = 0表示清空委托。delegateId必须是已经存在的GroupNFT。delegateId不能等于groupId。delegateId的当前 owner 可以批量清除指向自己的委托记录。delegateId默认不启用委托方白名单,所有存在的groupId都可以委托给自己;当前 owner 可以启用白名单,改为只允许白名单内的groupId委托给自己。- 委托是否有效,取决于
groupId当前 owner 是否匹配设置委托时的快照、delegateId当前 owner 是否匹配设置委托时的快照,以及当前白名单策略是否允许。 - 应用合约自行决定哪些操作接受 owner 或 delegate。
转让后的行为
- delegate 只在
ownerSnapshot == ownerOf(groupId)且delegateOwnerSnapshot == ownerOf(delegateId)时有效。 groupId转给新 owner 后,旧 owner 设置的 delegate 立即失效。groupId转回同一个 owner 后,之前的 delegate 会恢复有效。delegateId转给新 owner 后,旧 owner 设置的 delegate 立即失效。delegateId转回同一个 owner 后,之前的 delegate 会恢复有效。- 新 owner 可以调用
setDelegateId(groupId, 0)清掉已经失效的旧记录。
白名单规则
isDelegatorWhitelistEnabled(delegateId)返回delegateId当前是否启用委托方白名单。setDelegatorWhitelistEnabled(delegateId, true)后,只有白名单里的groupId可以把该delegateId设置为 delegate。setDelegatorWhitelistEnabled(delegateId, false)后,所有存在的groupId都可以把该delegateId设置为 delegate。setAllowedDelegatorGroupIds(delegateId, groupIds, allowed)由delegateId当前 owner 批量增删白名单。- 从白名单移除
groupId会立即让现有委托失效,但不会自动清除已经存在的 raw 记录;重新允许后可恢复有效,需要永久清理时由delegateId当前 owner 调用clearDelegatedGroupIds。
查询语义
delegateIdOf(groupId)返回当前有效 delegate,不存在有效委托时返回0。delegateIdsOf(groupIds)批量返回每个groupId当前有效 delegate,不存在有效委托时返回0。delegatedGroupIds(delegateId, offset, limit)按原始反向列表分页返回曾经/当前把delegateId设为 delegate 的groupId,并返回每个groupId当前是否仍然有效(同时受 delegator owner、delegate owner 和白名单影响)。delegatedGroupIdsCount(delegateId)返回原始反向委托列表数量,语义与delegatedGroupIds返回的total一致。allowedDelegatorGroupIdsCount(delegateId)返回委托方白名单数量,语义与allowedDelegatorGroupIds返回的total一致。ownerOrDelegateIdOf(groupId, account):- 当前 owner 返回
groupId - 有效 delegate 的当前 owner 返回
delegateId - 否则返回
0
- 当前 owner 返回
isOwnerOrDelegate(groupId, account)只回答某地址当前是否是 owner 或有效 delegate owner。
合约行为
- 设置或清空委托:
setDelegateId(uint256 groupId, uint256 delegateId) - 批量清除指向自己的委托:
clearDelegatedGroupIds(uint256 delegateId, uint256[] calldata groupIds) - 设置是否启用委托方白名单:
setDelegatorWhitelistEnabled(uint256 delegateId, bool enabled) - 批量设置委托白名单:
setAllowedDelegatorGroupIds(uint256 delegateId, uint256[] calldata groupIds, bool allowed) - 查询是否启用委托方白名单:
isDelegatorWhitelistEnabled(uint256 delegateId) - 查询当前是否可以设置委托:
canSetDelegateTo(uint256 groupId, uint256 delegateId) - 分页查询委托白名单:
allowedDelegatorGroupIds(uint256 delegateId, uint256 offset, uint256 limit) - 查询委托白名单数量:
allowedDelegatorGroupIdsCount(uint256 delegateId) - 查询有效委托:
delegateIdOf(uint256 groupId) - 批量查询有效委托:
delegateIdsOf(uint256[] calldata groupIds) - 分页查询反向委托列表:
delegatedGroupIds(uint256 delegateId, uint256 offset, uint256 limit) - 查询反向委托列表数量:
delegatedGroupIdsCount(uint256 delegateId) - 查询操作身份:
ownerOrDelegateIdOf(uint256 groupId, address account) - 查询是否可操作:
isOwnerOrDelegate(uint256 groupId, address account) - 绑定的 NFT 合约地址:
GROUP_ADDRESS()