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.