如何使用ERC721将NFT从一个账户转移到另一个账户? [英] How to transfer a NFT from one account to another using ERC721?

查看:9
本文介绍了如何使用ERC721将NFT从一个账户转移到另一个账户?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用OpenZeppelin ERC721Full合同编写和NFT智能合同。我可以制造NFT,但我想要一个按钮,使它们能够被购买。我正在尝试编写此函数:

function buyNFT(uint _id) public payable{
    //Get NFT owner address
    address payable _seller = ownerOf(_id);

    // aprove nft sell
    approve(_seller, _id);
    setApprovalForAll(msg.sender, true);

    //transfer NFT
    transferFrom(_seller, msg.sender, _id);

    // transfer price in ETH
    address(_seller).transfer(msg.value);

    emit NftBought(_seller, msg.sender, msg.value);

  }

这不起作用,因为必须由所有者或已批准的地址调用函数Approve。我不知道应该如何构建一个购买功能。我知道我必须使用一些要求,但首先我希望该函数在测试中起作用,然后我将编写要求。

购买函数应该如何编码?因为我找到的唯一解决方案是覆盖Approve函数,并省略谁可以调用此函数的要求。但它看起来不是应该这样做的。

谢谢!

推荐答案

您可以只使用_transfer()函数,有关实现示例,请参阅Mybuy()函数。

销售审批可以使用自定义映射完成-在我的示例中tokenIdToPrice。如果该值非零,则令牌ID(映射密钥)将出售。

这是允许销售NTF的基本代码。请随时扩展我的代码,以允许&q;免费赠送&q;、&q;白名单买家&q;或任何其他功能。

pragma solidity ^0.8.4;

import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol';

contract MyToken is ERC721 {
    event NftBought(address _seller, address _buyer, uint256 _price);

    mapping (uint256 => uint256) public tokenIdToPrice;

    constructor() ERC721('MyToken', 'MyT') {
        _mint(msg.sender, 1);
    }

    function allowBuy(uint256 _tokenId, uint256 _price) external {
        require(msg.sender == ownerOf(_tokenId), 'Not owner of this token');
        require(_price > 0, 'Price zero');
        tokenIdToPrice[_tokenId] = _price;
    }

    function disallowBuy(uint256 _tokenId) external {
        require(msg.sender == ownerOf(_tokenId), 'Not owner of this token');
        tokenIdToPrice[_tokenId] = 0;
    }
    
    function buy(uint256 _tokenId) external payable {
        uint256 price = tokenIdToPrice[_tokenId];
        require(price > 0, 'This token is not for sale');
        require(msg.value == price, 'Incorrect value');
        
        address seller = ownerOf(_tokenId);
        _transfer(seller, msg.sender, _tokenId);
        tokenIdToPrice[_tokenId] = 0; // not for sale anymore
        payable(seller).transfer(msg.value); // send the ETH to the seller

        emit NftBought(seller, msg.sender, msg.value);
    }
}

如何模拟销售:

  1. 协定部署者(msg.sender)获取令牌ID%1。
  2. 执行allowBuy(1, 2),这将允许任何人以2魏的价格购买令牌ID%1。
  3. 从第二个地址执行buy(1)SENDING WEI,以购买令牌ID%1。
  4. 调用(父ERC721)函数ownerOf(1)以验证所有者现在是否为第二个地址。

这篇关于如何使用ERC721将NFT从一个账户转移到另一个账户?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆