首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止用户将他们从我的平台上获得的NFTs销售到像openSea这样的外部市场

如何防止用户将他们从我的平台上获得的NFTs销售到像openSea这样的外部市场
EN

Ethereum用户
提问于 2023-03-03 07:40:08
回答 2查看 93关注 0票数 3

我正在构建我的平台,用户将做几个任务来赚取NFT作为回报,我不希望他们在任何外部市场上出售这些NFT。是否有一种方法可以限制我的NFT仅限于我的生态系统?如果有人有任何建议,请告诉我!

EN

回答 2

Ethereum用户

回答已采纳

发布于 2023-03-24 18:33:27

我看到3种可能的选择,取决于哪些最适合当前和未来的用例用于您的合同:

合同XXX是ERC721,拥有{}

1-您可以重写_safeTransferFrom函数,以包含暂停所有传输的选项(如果暂停= true,则禁用所有传输,包括销售):

代码语言:javascript
复制
bool public transfersPaused = false;

function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(transfersPaused = false), "transfers paused")
        safeTransferFrom(from, to, tokenId, "");
    }

function setTransfersPaused(bool _setPause) public onlyOwner {
        transfersPaused = _setPause;
    }

2-你也可以黑名单/阻止特定的合同地址(市场=经营者)从启动转移(如果你确定了他们的地址)。

代码语言:javascript
复制
bool public transfersPaused = false;
address[] public blockedOperators;

function blockOperators(address[] calldata _blockList) public onlyOwner {
    delete blockedOperators;
    blockedOperators = _blockList;
}

function isBlocked(address _contract) public view returns (bool) {
    for (uint i = 0; i < blockedOperators.length; i++) {
        if (blockedOperators[i] == _contract) {
        return true;
        }
    }
    return false;
}

function setTransfersPaused(bool _setPause) public onlyOwner {
    transfersPaused = _setPause;
}

function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
    require(transfersPaused = false, "transfers paused");
    if (isBlocked(msg.sender) == true) {
        revert("no transfer allowed");
    }
    safeTransferFrom(from, to, tokenId, "");
}

3-与_safeTransferFrom函数类似,您也可以对_setApprovalForAll函数进行操作。它限制了对代表用户管理令牌所需的操作员批准的访问(这基本上阻碍了大多数市场交换令牌的能力)。

代码语言:javascript
复制
bool public approvalsPaused = false;
mapping(address => mapping(address => bool)) private _operatorApprovals;

function _setApprovalForAll(address owner, address operator, bool approved) internal virtual override {
    require(owner != operator, "ERC721: approve to caller");
    require(approvalsPaused = false, "Approvals paused");
            if (isBlocked(msg.sender) == true) {
        revert("no transfer allowed");
    }
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
}

请注意,任何已授予的审批(先前的限制)都不能用此代码撤销。您还需要将blockOperators和isBlocked函数包含到合同中(参见2)

票数 1
EN

Ethereum用户

发布于 2023-03-03 09:38:36

是啊,只要关掉传输功能就行了。如果您正在使用openzeppelin,那么您可以这样做,只需添加此代码,传输函数将始终恢复。即使您没有使用openzeppelin,这也会起作用,您只需要移除重载关键字,因为这里不需要它。

代码语言:javascript
复制
function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal pure override {
        revert("No batch transfer allowed");
    }

      function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal pure override {
        revert("no transfer allowed");
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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