我试图在拍卖ERC721令牌的地方制定一套合同,然后获胜者将令牌放入钱包。我不完全确定如何构建它。这些是我认为需要的合同。
WALLET
AuctionFactory
合同并保存地址AUCTIONFACTORY
Auction
合同,项目为指定的ERC721令牌拍卖
Wallet
,允许操纵合同中的mapping
状态变量,将ERC721令牌放入获胜者钱包问题是Auction
无法从Wallet
继承。 AuctionFactory
尝试部署拍卖时,编译器会抛出错误 - cannot create instance of derived or same contract
。这对我来说很有意义,因为Wallet
部署了工厂,如果工厂部署了Auction
继承自Wallet
的工厂,那么它在技术上会部署其父合同。
所以我的问题是,我如何构建这套合同?如何允许拍卖合同的实例与另一个合同上的商店进行沟通和操纵?
答案 0 :(得分:0)
我不确定您为什么需要从Wallet
合同继承。拍卖结构应类似于:
createAuction
进行拍卖createAuction(tokenId, minPrice, duration)
将:
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];
}
以上是该项目的功能全面的起点。