嗨,我正在围绕一个NFT项目构建一个基于区块链的游戏,并希望了解是否有可能实现以下内容。
在NFT契约上有一个方法,该方法在调用时可以锁定所有薄荷NFT的传输一段时间。有点像一个标签游戏,而不是当你的标签,合同所有(NFT /球员)不能(移动/transfer)
我假设我需要覆盖传输方法,然后进行布尔检查。有点像
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
if(!isLocked){
safeTransferFrom(from, to, tokenId, "");
}
}这会像我预期的那样起作用吗?这有什么问题吗?并且会覆盖转移方法,特别是在安全等方面。
很抱歉有这么广泛的问题
谢谢
发布于 2022-01-18 12:49:35
从上下文来看,您似乎在使用OpenZeppelin 实现。如果是这样的话,您可以重写它们的_beforeTokenTransfer()函数,该函数实际上是从执行令牌传输的all函数中调用的(因为其中有多个)。
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");
}
}如果您正在使用其他实现或自定义实现,或者只选择覆盖公共可见函数,请确保没有其他public或external函数允许在没有锁定机制的情况下进行传输。
此外,您当前代码的注释也很少:
virtual关键字。它允许进一步重写该函数。除非您也期望重写此函数,否则可以安全地删除关键字。super关键字(与中相同):super.safeTransferFrom(from, to, tokenId);https://stackoverflow.com/questions/70745661
复制相似问题