Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-4944: 只有一个非同质化代币的合约

兼容 ERC-721 的单一代币 NFT

Authors Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Andres El-Fakdi (@Bluezfish)
Created 2022-03-25
Discussion Link https://ethereum-magicians.org/t/erc721-minting-only-one-token/8602/2
Requires EIP-721

摘要

以下描述的是具有一个总供应量的,兼容 ERC-721 的合约的标准函数。 这允许将 NFT 与单个合约地址唯一关联。

动机

如果修改 ERC-721 为仅铸造 1 个代币(每个合约),则合约地址可以与该铸造的代币唯一标识(而不是像 ERC-721 要求那样,通过合约地址 + 代币 ID 的元组)。 此更改将自动启用可组合代币 ERC-998 的所有功能(拥有其他 ERC-721 或 ERC-20),而无需添加任何额外的代码,只需禁止每个已部署的合约铸造多个代币即可。 然后,使用此合约铸造的 NFT 可以使用他的“预算”(他拥有的 ERC-20)进行操作,也可以与其他他可以拥有的 NFT 进行交易。就像一个自主代理,可以决定如何处理他的财产(出售他的 NFT,购买其他 NFT 等)。

设想的第一个用例是价值保存。 数字资产,如 NFT,具有必须保存的价值,以避免丢失。 如果资产有自己的预算(在其他 ERC-20 代币中),可以使用它来自动保存自己。

规范

构造函数应铸造合约的唯一代币,然后 mint 函数应添加限制以避免进一步铸造。

此外,应添加一个 tokenTransfer 函数,以允许合约所有者与合约/NFT 本身拥有的 ERC-20 代币进行交易。 这样,如果合约收到 ERC-20 代币的转账,NFT 的所有者可以从合约钱包中花费它。

理由

主要动机是保持合约与当前 ERC-721 平台的兼容性。

向后兼容性

没有向后兼容性问题。

参考实现

在合约中添加变量 _minted

    bool private _minted;

在构造函数中,自动铸造第一个代币并将变量设置为 true:

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

添加其他函数以与 NFT 属性(例如,ERC-20)进行交互:

    modifier onlyOwner() {
        require(balanceOf(msg.sender) > 0, "Caller is not the owner of the NFT");
        _;
    }

    function transferTokens(IERC20 token, address recipient, uint256 amount) public virtual onlyOwner {
        token.transfer(recipient, amount);
    }
	
    function balanceTokens(IERC20 token) public view virtual returns (uint256) {
        return token.balanceOf(address(this));
    }

安全考虑

未发现安全问题。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Andres El-Fakdi (@Bluezfish), "ERC-4944: 只有一个非同质化代币的合约 [DRAFT]," Ethereum Improvement Proposals, no. 4944, March 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4944.