Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-4950: 纠缠代币

ERC-721 扩展,铸造两个相互关联的代币

Authors Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Easy Innova (@easyinnova)
Created 2022-03-28
Discussion Link https://ethereum-magicians.org/t/entangled-tokens/8702
Requires EIP-20, EIP-721, EIP-1155

摘要

此 EIP 定义了一个接口,用于将智能合约钱包的控制权通过纠缠的 ERC-721 非同质化代币委托给用户对。

动机

动机是提供一种通过 NFT 共享钱包的简单方法,以便购买 NFT(在市场上)的行为赋予买方访问给定钱包的权限。该钱包可能拥有多种代币的预算,甚至可能拥有其他 NFT。

一个用例是保持艺术家与其 NFT 买家之间的联系。如果艺术家 T 创建了一个带有 NFT 的数字艺术作品 P,那么 T 创建 2 个纠缠代币 A 和 B,以便他保留 A 并将 B 转移到 P。通过纠缠代币的构造,它们只能进行一次转移,因此艺术家通过向 A 发送一笔交易来证明他是 P 的创建者,该交易可以从 B 中看到。否则,P 的所有者可以通过向 B 发送一笔交易来检查艺术家的真实性,以便艺术家可以通过展示 A 的结果来证明。

这个用例的一个版本是,当一个用户 U 直接以纠缠代币 A 的形式铸造他的艺术作品时;然后用户 U 出售/转移它,同时将纠缠代币 B 保留在 U 的钱包中。无论 A 的所有者是谁,艺术作品和艺术家都将纠缠在一起。

设想这些纠缠代币的应用对于以下方面是有用的:

  1. NFT 作者身份 / 艺术创作
  2. 创作者分配版税。
  3. 艺术品的真实性:创作仅限于作者(例如,如果该 NFT 中有 1000 个 1000 个纠缠代币,则仅限 1000 个副本)。
  4. Usowners(消费 NFT 的用户也成为 NFT 的部分所有者)
  5. 重塑产权:拥有该财产的人无需追随所有者的脚步即可获得该财产。
  6. 身份:只有那些与您拥有纠缠代币的凭证才与您相关。
  7. Vreservers(价值储备者)。

规范

纠缠代币合约实现了 ERC-721,但附加了一个限制,即它仅在合约部署时铸造正好两个代币:一个 tokenId0,另一个 tokenId1。 纠缠代币合约还实现了一个智能合约钱包,可以由这两个代币的所有者进行操作。

此外,还应添加一个 tokenTransfer 函数,以便允许代币所有者与合约/NFT 本身拥有的 ERC-20 代币进行交易。 函数签名如下:

    function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners;

原理

我们决定扩展 ERC-721ERC-1155 也有可能),因为这的主要目的是与当前的市场平台兼容。 这些纠缠的 NFT 将在市场上列出,购买它的用户将有可能与钱包属性(同质化和非同质化代币)进行交易。

向后兼容性

没有向后兼容性问题。

参考实现

在合约构造函数中铸造两个,并且只有两个代币,并将 minted 属性设置为 true:

bool private _minted;

constructor(string memory name, string memory symbol, string memory base_uri) ERC721(name, symbol) {
        baseUri = base_uri;
        _mint(msg.sender,0);
        _mint(msg.sender,1);
        _minted = true;
    }

function _mint(address to, uint256 tokenId) internal virtual override {
    require(!_minted, "ERC4950: already minted");
    super._mint(to, tokenId);
}

添加额外的函数,以允许两个 NFT 用户所有者使用合约拥有的其他 ERC-20 代币进行操作:

    modifier onlyOwners() {
        require(balanceOf(msg.sender) > 0, "Caller does not own any of the tokens");
        _;
    }

function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners {
        token.transfer(recipient, amount);
    }

安全考虑

没有安全方面的考虑。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Easy Innova (@easyinnova), "ERC-4950: 纠缠代币 [DRAFT]," Ethereum Improvement Proposals, no. 4950, March 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4950.