我有一个ERC-721令牌,我希望在transferFrom函数中实现一个条件,一旦满足了某个条件,就不会在区块链上交易令牌。具体来说,我希望权证有一个有限的交易寿命,比如说5个交易,在此之后,它不应该在任何种类的交易所上市。
但是,我担心实现此条件可能会使ERC-721令牌不符合交易所遵循的标准。我希望在执行这一交易限制的同时,确保令牌与其他交易所保持兼容。
如何实现此条件,使其不违反ERC-721标准,并使令牌可在其他交易所进行交易?
注意:我正在使用稳健性,并考虑修改transferFrom函数以强制执行交易限制。
发布于 2023-06-02 11:13:36
首先,您需要了解什么是ERC721,或者说,任何接口标准--它只是智能契约需要实现的一组功能和事件。

实际的实现是留给开发人员的--例如,当transferFrom被调用时,通常通过更新一些内部mapping(uint256 => address)来处理,这样tokenId就指向了一个新的钱包地址。但是这一点根本没有强制执行--如果您决定使用带索引的数组,则没有人能够阻止您。您还将看到,只有tokenId所有者才能传输它的限制不是在接口级别上定义的。我想说的是,接口只是一个承诺,第三方合同(或市场)只能通过调用supportsInterface(interfaceId)来检查。不管你是否真的履行了承诺(或者签订了恶意合同),这都是另一回事。
为了回到你最初的问题,是的,你当然可以施加一个转让限制(我们已经有了NFT和链上版税的强制执行)。
对于您的场景,您必须覆盖在所有三个_transfer变体中使用的内部(safe)transferFrom函数,并添加一个映射来存储每个令牌传输的次数。也许是这样的:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract TransferRestrictedNFT is ERC721 {
uint256 private immutable MAX_TOKEN_TRANSFERS;
mapping(uint256 => uint256) private _tokenTransfers;
constructor(
string memory name,
string memory symbol,
uint256 maxTokenTransfers
) ERC721(name, symbol) {
MAX_TOKEN_TRANSFERS = maxTokenTransfers;
}
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
require(
_tokenTransfers[tokenId] < MAX_TOKEN_TRANSFERS,
"<YOUR ERROR MESSAGE>"
);
_tokenTransfers[tokenId]++;
super._transfer(from, to, tokenId);
}
}我在这里给出了一个一般的例子,但是如果操作者是主要的市场之一,你很可能可以修改它来计算“交易”。
https://ethereum.stackexchange.com/questions/150908
复制相似问题