我正在构建我的平台,用户将做几个任务来赚取NFT作为回报,我不希望他们在任何外部市场上出售这些NFT。是否有一种方法可以限制我的NFT仅限于我的生态系统?如果有人有任何建议,请告诉我!
发布于 2023-03-24 18:33:27
我看到3种可能的选择,取决于哪些最适合当前和未来的用例用于您的合同:
合同XXX是ERC721,拥有{}
1-您可以重写_safeTransferFrom函数,以包含暂停所有传输的选项(如果暂停= true,则禁用所有传输,包括销售):
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-你也可以黑名单/阻止特定的合同地址(市场=经营者)从启动转移(如果你确定了他们的地址)。
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函数进行操作。它限制了对代表用户管理令牌所需的操作员批准的访问(这基本上阻碍了大多数市场交换令牌的能力)。
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)
发布于 2023-03-03 09:38:36
是啊,只要关掉传输功能就行了。如果您正在使用openzeppelin,那么您可以这样做,只需添加此代码,传输函数将始终恢复。即使您没有使用openzeppelin,这也会起作用,您只需要移除重载关键字,因为这里不需要它。
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");https://ethereum.stackexchange.com/questions/146826
复制相似问题