首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果符合某些条件,如何防止ERC-721的交易?

如果符合某些条件,如何防止ERC-721的交易?
EN

Ethereum用户
提问于 2023-06-02 06:31:35
回答 1查看 16关注 0票数 0

我有一个ERC-721令牌,我希望在transferFrom函数中实现一个条件,一旦满足了某个条件,就不会在区块链上交易令牌。具体来说,我希望权证有一个有限的交易寿命,比如说5个交易,在此之后,它不应该在任何种类的交易所上市。

但是,我担心实现此条件可能会使ERC-721令牌不符合交易所遵循的标准。我希望在执行这一交易限制的同时,确保令牌与其他交易所保持兼容。

如何实现此条件,使其不违反ERC-721标准,并使令牌可在其他交易所进行交易?

注意:我正在使用稳健性,并考虑修改transferFrom函数以强制执行交易限制。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-06-02 11:13:36

首先,您需要了解什么是ERC721,或者说,任何接口标准--它只是智能契约需要实现的一组功能和事件。

实际的实现是留给开发人员的--例如,当transferFrom被调用时,通常通过更新一些内部mapping(uint256 => address)来处理,这样tokenId就指向了一个新的钱包地址。但是这一点根本没有强制执行--如果您决定使用带索引的数组,则没有人能够阻止您。您还将看到,只有tokenId所有者才能传输它的限制不是在接口级别上定义的。我想说的是,接口只是一个承诺,第三方合同(或市场)只能通过调用supportsInterface(interfaceId)来检查。不管你是否真的履行了承诺(或者签订了恶意合同),这都是另一回事。

为了回到你最初的问题,是的,你当然可以施加一个转让限制(我们已经有了NFT和链上版税的强制执行)。

对于您的场景,您必须覆盖在所有三个_transfer变体中使用的内部(safe)transferFrom函数,并添加一个映射来存储每个令牌传输的次数。也许是这样的:

代码语言:javascript
复制
// 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);
    }
}

我在这里给出了一个一般的例子,但是如果操作者是主要的市场之一,你很可能可以修改它来计算“交易”。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/150908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档