拍卖完成后将ERC721令牌推入钱包

时间:2018-04-08 13:05:21

标签: ethereum solidity smartcontracts

我试图在拍卖ERC721令牌的地方制定一套合同,然后获胜者将令牌放入钱包。我不完全确定如何构建它。这些是我认为需要的合同。

WALLET

  1. 包含地址到所拥有的令牌的映射
  2. 部署后,created会部署AuctionFactory合同并保存地址
  3. AUCTIONFACTORY

    1. 根据命令部署Auction合同,项目为指定的ERC721令牌
    2. 拍卖

      1. 包含拍卖的所有逻辑
      2. 继承Wallet,允许操纵合同中的mapping状态变量,将ERC721令牌放入获胜者钱包
      3. 问题是Auction无法从Wallet继承。 AuctionFactory尝试部署拍卖时,编译器会抛出错误 - cannot create instance of derived or same contract。这对我来说很有意义,因为Wallet部署了工厂,如果工厂部署了Auction继承自Wallet的工厂,那么它在技术上会部署其父合同。

        所以我的问题是,我如何构建这套合同?如何允许拍卖合同的实例与另一个合同上的商店进行沟通和操纵?

2 个答案:

答案 0 :(得分:0)

我不确定您为什么需要从Wallet合同继承。拍卖结构应类似于:

  • 令牌X的所有者从您的合约中调用函数createAuction进行拍卖
  • createAuction(tokenId, minPrice, duration)将:
    1. 将所有者地址,令牌ID和一些其他信息(最低价格,期限等)存储到映射中。您可能会使用令牌ID作为映射键。
    2. 使用ERC721合同中的transferFrom函数将所有权从当前所有者转移到拍卖合同本身,例如:erc721.transferFrom(owner, this, tokenId)。稍后在您必须将所有权转让给买方时需要这样做。
  • 有买家加入游戏,并通过致电bidOnAuction(tokenId)对此拍卖出价。检查参数(msg.value > minPrice,持续时间等)。并且,如果这些是中标条件,则您再次调用erc721方法:erc721.transferFrom(this, msg.sender, tokenId),将钱转移给卖方(所有者),并将令牌所有权从合同转移给买方。

拍卖合同是一种托管,它将保留ERC721令牌的所有权,直到拍卖完成(购买或取消)。您不必“操纵所有权”,只需要让所有者将令牌转移到您的合同中,然后,如果拍卖被取消,则您的合同将所有权转移给先前的所有者,如果拍卖被取消,则将所有权转移给买方。完成。

答案 1 :(得分:0)

这是一个示例合同,可以存放令牌,然后将其拍卖掉。这是一个基本的拍卖模型,显示了转移令牌所有权的控制流程。

这是设置。首先,我们必须导入ERC-721标头。我为此使用ERC-721的参考实现:

pragma solidity 0.5.1;
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/erc721.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/erc721-token-receiver.sol";

以下是合同和主要数据结构:

// This implements an ERC-721 auction by taking ownership of tokens
contract CollectableAuction is ERC721TokenReceiver {
    mapping (uint256 => AuctionDetails) auctionDetails;

    struct AuctionDetails {
        ERC721 nftContract;
        bool bidIsComplete;
        address seller;
        address winningBidder;
        uint256 tokenId;
    }
}

我们添加了存款机制。通过允许人们将代币直接发送到拍卖合同来工作。您可以采用不同的机制来开始拍卖,但是这种机制同样有效。

    // Deposit an asset and start an auction
    function onERC721Received(
        address,
        address from,
        uint256 tokenId,
        bytes calldata
    )
        external
        returns(bytes4)
    {
        uint256 auctionId = uint256(keccak256(abi.encode(uint256(msg.sender), tokenId)));
        auctionDetails[auctionId] = AuctionDetails({
            nftContract: ERC721(msg.sender),
            bidIsComplete: false,
            seller: from,
            winningBidder: address(0),
            tokenId: tokenId
        });
        return 0x150b7a02;
    }

这是您的拍卖过程的模拟实现。您的实际拍卖肯定会更加复杂。

    function completeAuction(uint256 auctionId) external {
        auctionDetails[auctionId].bidIsComplete = true;
    }

最后,当拍卖完成时,中标者需要获得令牌。

    function withdraw(uint256 auctionId) external {
        AuctionDetails storage details = auctionDetails[auctionId];

        require(details.bidIsComplete);
        require(msg.sender == details.winningBidder);
        // Collect money from winning bidder

        details.nftContract.safeTransferFrom(address(this), details.winningBidder, details.tokenId);
        // Send money to seller
        // Do event logging
        delete auctionDetails[auctionId];
    }

以上是该项目的功能全面的起点。