ERC-7721: 用于 ERC-1155 的可锁定扩展
用于使用 locker 和基于 token id 的授权来启用 ERC-1155 锁定的接口
Authors | Piyush Chittara (@piyush-chittara) |
---|---|
Created | 2023-05-25 |
Discussion Link | https://ethereum-magicians.org/t/erc-7721-lockable-extension-for-erc1155/20250 |
Requires | EIP-165, EIP-1155 |
摘要
ERC-1155 的可锁定扩展为 ERC-1155 token 标准引入了一种强大的锁定机制,用于锁定特定的非同质化 Token (NFT),允许各种用途,同时防止出售或转移。token 的 owner
可以 lock
它,设置 locker 地址(EOA 或合约),该地址专门拥有解锁 token 的权力。Owner 还可以为 tokenId
提供授权,从而能够在地址持有 token 授权时锁定资产。Token 也可以由 approved
锁定,将 locker 分配给自己。Token 转移后,这些权利将被清除。
受对 token 化资产的增强安全性和控制的需求的启发,此扩展使 token 所有者能够锁定具有 tokenId
的各个 NFT,从而确保只有经过批准的用户才能提取预定数量的已锁定 token。因此,通过允许 token 所有者指定批准的 token ID 和提款金额,从而提供了一种更安全的方法。
动机
ERC-1155 引发了对 NFT 的前所未有的需求激增。然而,尽管取得了巨大的成功,但 NFT 经济仍然受到二级流动性的影响,导致其在所有者的钱包中仍然缺乏流动性。有些项目旨在解决流动性挑战,但它们给所有者带来了以下不便和风险,因为它们需要将参与的 NFT 转移到项目的合约中。
- 效用损失:当 NFT 转移到托管账户时,它们的效用价值会降低,不再由所有者直接保管。
- 缺乏可组合性:如果 NFT 所有者可以使用多种金融工具,例如利用贷款和出租资产以获得最大回报,那么市场可能会从流动性的增加中受益。可组合性是创建更高效市场中缺失的一环。
- 智能合约漏洞:由于 NFT 所依赖的智能合约中可能存在的错误或漏洞,NFT 容易丢失或被盗。
上述问题导致用户体验 (UX) 较差,因此我们建议通过实施原生锁定机制来增强 ERC-1155 标准: NFT 不是转移到智能合约,而是安全地存储在自我保管中,但被锁定。 在锁定期间,NFT 的转移受到限制,而其其他属性保持不变。 NFT 所有者保留使用或分配其效用的能力。
NFT 有许多用例,其中 NFT 必须保留在所有者的钱包中,即使它用作贷款的抵押品。无论是授权访问 Discord 服务器,还是在边玩边赚 (P2E) 游戏中使用 NFT,所有者都应该可以在整个贷款期间自由地这样做。正如房地产所有者可以继续住在抵押的房子里,申请个人贷款或让租户产生被动收入一样,这些功能也应该提供给 NFT 所有者,以吸引更多投资者进入 NFT 经济。
可锁定的 NFT 启用以下用例:
- NFT 抵押贷款:利用 NFT 作为贷款的抵押品,而无需将其锁定在贷款协议合约上。 相反,在享受 NFT 所有效用的同时,将其锁定在所有者的钱包中。
- 无需抵押的 NFT 租赁:支付费用借用 NFT,而无需大量抵押品。 租户可以使用 NFT 但不能转移它,从而确保贷款人的安全。 借贷服务合约会在借用期满后自动将 NFT 返还给贷方。
- 先买后付 (BNPL):买方收到锁定的 NFT,并且可以立即开始使用它。 但是,在支付所有分期付款之前,他们无法出售 NFT。 未能完成全额付款会导致 NFT 返回给卖方,并收取费用。
- 可组合性:通过访问多种金融工具来最大化流动性。 想象一下,以 NFT 为抵押获得贷款,并将其出租以产生被动收入。
- 首次销售:铸造 NFT 以支付部分款项,并在所有者对藏品的进度感到满意后结算剩余金额。
- Soulbound:组织可以铸造并自分配
locker
,将 token 发送给用户并锁定资产。 - 安全性:安全且方便地使用独家蓝筹 NFT。 可锁定扩展允许所有者锁定 NFT 并将安全冷钱包指定为解锁器。 这样,所有者可以将 NFT 保留在 MetaMask 上并轻松使用它,即使黑客获得了 MetaMask 账户的访问权限。 如果无法访问冷钱包,黑客将无法转移 NFT,从而确保其安全。
此提案在许多方面与其他锁定提案不同:
- 此实现提供了
lock
和unlock
的最小实现,并且认为其他条件(如时限)是很棒的想法,但无需创建特定的实现即可实现。锁定和解锁可以基于任何条件(例如,还款、到期)。因此,有时限解锁是一个相对特定的用例,可以通过智能合约本身来实现,而无需成为 token 合约的一部分。 - 此实现建议将 locker 和批准者之间的权利分开。Token 可以通过授权进行锁定,并且被授权者可以解锁和提取 token(开辟了租赁、借贷、BNPL 等机会),并且 token 可以锁定,而没有撤销 token 的权利,但如果需要可以解锁(开辟了类似帐户绑定 NFT 的机会)。
- 我们的提案实现了
transferAndLock
的能力,该能力可用于转移、锁定和可选地批准 token。从而可以在转移后进行撤销。
通过扩展 ERC-1155 标准,拟议的标准能够安全方便地管理底层 NFT 资产。它原生支持流行的 NFTFi 用例,例如抵押、借贷和租赁。我们预计此拟议标准将促进 NFT 所有者更多地参与 NFTFi 项目,从而增强 NFT 生态系统的整体活力。
规范
本文档中的关键词“必须 (MUST)”,“不得 (MUST NOT)”,“必需 (REQUIRED)”,“应该 (SHALL)”,“不应该 (SHALL NOT)”,“应当 (SHOULD)”,“不应当 (SHOULD NOT)”,“推荐 (RECOMMENDED)”,“不推荐 (NOT RECOMMENDED)”,“可以 (MAY)”和“可选 (OPTIONAL)”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
概述
符合 ERC-1155 的合约可以实施此 EIP,以提供在其当前所有者地址锁定和解锁 token 的标准方法。
Token 所有者可以使用 lock(uint256 tokenId, address account, address _locker, uint256 amount)
函数 lock
token 并将 locker
分配给某个 address
,这必须将 locker
设置为 _locker
。Token 所有者或授权者可以使用 lock(uint256 tokenId, address account, uint256 amount
函数 lock
token,这必须将 locker
设置为 msg.sender
。Token 可以由 locker
使用 unlock(uint256 tokenId, address account, uint256 amount)
函数 unlocked
。
Token 所有者可以使用 setApprovalForId(uint256 tokenId, address operator, uint256 amount)
为特定的 tokenId
专门 approve
,从而确保只有获得授权的 tokenId 才能由 operator 花费。getApprovalForId(uint256 tokenId, address account, address operator)
应该返回 operator
在 account
上批准的 amount
。
如果 token 已 locked
,则 getLocked(uint256 tokenId, address account, address operator)
函数必须返回 operator
在 account
上 locked
的金额。对于未 locked
的 token,getLocked(uint256 tokenId, address account, address operator)
函数必须返回 0
。
如果 account
余额不足或不是 tokenId
的 owner
或 approved
,则 lock
函数必须恢复。如果提供的 tokenId
的 amount
未 locked
,则 unlock
函数必须恢复。如果 account
转移 locked
金额,则 token 的 ERC-1155 safeTransferFrom
必须恢复,最大可转移金额必须是 balance - getLocked
。
可以使用 transferAndLock
函数来转移和 locked
token,还可以将 approval
分配给 locker
。建议在需要 Token 转移和后续撤销的用例中使用此功能。
接口
// SPDX-License-Identifier: CC0-1.0
pragma solidity >=0.7.0 <0.9.0;
/// @title Lockable Extension for ERC1155
/// @dev Interface for the Lockable extension
/// @author piyush-chittara
interface IERCLockable1155 is IERC1155{
/**
* @dev Emitted when tokenId is locked
*/
event Lock(uint256 indexed tokenId, address account, address _locker, uint256 amount);
/**
* @dev Emitted when tokenId is unlocked
*/
event Unlock (uint256 indexed tokenId, address account, address _locker, uint256 amount);
/**
* @dev Lock the tokenId if msg.sender is owner or approved and set locker to msg.sender
*/
function lock(uint256 tokenId, address account, uint256 amount) external;
/**
* @dev Lock the tokenId if msg.sender is owner and set locker to _locker
*/
function lock(uint256 tokenId, address account, address _locker, uint256 amount) external;
/**
* @dev Unlocks the tokenId if msg.sender is locker
*/
function unlock(uint256 tokenId, address account, uint256 amount) external;
/**
* @dev Tranfer and lock the token if the msg.sender is owner or approved.
* Lock the token and set locker to caller
* Optionally approve caller if bool setApprove flag is true
*/
function transferAndLock(address from, address to, uint256 tokenId, uint256 amount, bool setApprove) external;
/**
* @dev Returns the wallet, that is stated as unlocking wallet for the tokenId.
* If (0) returned, that means token is not locked. Any other result means token is locked.
*/
function getLocked(uint256 tokenId, address account, address operator) external view returns (uint256);
function setApprovalForId(uint256 tokenId, address operator, uint256 amount) external;
}
原理
此提案公开了 transferAndLock(address from, address to, uint256 tokenId, uint256 amount, bool setApprove)
,可用于转移 token 并在接收者的地址处锁定。此外,此功能还接受输入 bool setApprove
,如果为 true
,则将 approval
分配给 locker
,从而使 locker
能够撤销 token(撤销条件可以在合约中定义,并且 approval
提供给合约)。这为接收者提供了有条件的拥有权,而没有 transfer
token 的特权。
向后兼容性
此标准与 ERC-1155 标准兼容。
现有的可升级 ERC-1155 可以升级到此标准,从而固有地启用锁定功能并解锁底层流动性功能。
测试用例
参考实现
参考接口可以在此处找到。
参考实现可以在此处找到。
安全考虑事项
对于管理 ERC-1155 的合约,与此标准的实施没有直接相关的安全考虑事项。
与可锁定 token 配合使用的合约的注意事项
- 一旦某个
amount
被locked
,指定的amount
就无法从锁定的account
中转移。 - 如果 token 已
locked
并且调用者既是locker
又是approved
,则调用者可以转移 token。 - 以不可访问的帐户或未经验证的合约地址作为
locker
的locked
token 可能会导致 token 的永久锁定。 - 关于可锁定 token 没有 MEV 考虑事项,因为只有经过授权的方才允许锁定和解锁。
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Piyush Chittara (@piyush-chittara), "ERC-7721: 用于 ERC-1155 的可锁定扩展 [DRAFT]," Ethereum Improvement Proposals, no. 7721, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7721.