首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >erc721 NFT的锁传输

erc721 NFT的锁传输
EN

Stack Overflow用户
提问于 2022-01-17 18:00:38
回答 1查看 1.6K关注 0票数 0

嗨,我正在围绕一个NFT项目构建一个基于区块链的游戏,并希望了解是否有可能实现以下内容。

在NFT契约上有一个方法,该方法在调用时可以锁定所有薄荷NFT的传输一段时间。有点像一个标签游戏,而不是当你的标签,合同所有(NFT /球员)不能(移动/transfer)

我假设我需要覆盖传输方法,然后进行布尔检查。有点像

代码语言:javascript
复制
    function safeTransferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public virtual override {
            if(!isLocked){
            safeTransferFrom(from, to, tokenId, "");
}
        }

这会像我预期的那样起作用吗?这有什么问题吗?并且会覆盖转移方法,特别是在安全等方面。

很抱歉有这么广泛的问题

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-01-18 12:49:35

从上下文来看,您似乎在使用OpenZeppelin 实现。如果是这样的话,您可以重写它们的_beforeTokenTransfer()函数,该函数实际上是从执行令牌传输的all函数中调用的(因为其中有多个)。

代码语言:javascript
复制
pragma solidity ^0.8;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyCollection is ERC721 {
    constructor() ERC721("MyCollection", "MyC") {
        _mint(msg.sender, 1);
    }

    // needs to be unlocked for the `_mint()` function in constructor
    bool locked = false;

    function setLocked(bool _locked) external {
        locked = _locked;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        require(!locked, "Cannot transfer - currently locked");
    }
}

如果您正在使用其他实现或自定义实现,或者只选择覆盖公共可见函数,请确保没有其他publicexternal函数允许在没有锁定机制的情况下进行传输。

此外,您当前代码的注释也很少:

  • 您可能不需要virtual关键字。它允许进一步重写该函数。除非您也期望重写此函数,否则可以安全地删除关键字。
  • 您调用的父函数具有相同的名称,但参数集不同。如果您想使用相同名称的调用相同参数集的父函数(假设它已定义),则需要使用super关键字(与中相同):super.safeTransferFrom(from, to, tokenId);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745661

复制
相关文章

相似问题

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