gpt4 book ai didi

ethereum - 拍卖完成后将 ERC721 代币推送到钱包中

转载 作者:行者123 更新时间:2023-12-04 16:03:41 25 4
gpt4 key购买 nike

我正在尝试开发一套契约(Contract),其中拍卖 ERC721 代币,然后获胜者将代币放入他们的钱包。我不完全确定如何构建它。这些是我认为需要的契约(Contract)。

钱包

  1. 包含地址到拥有的代币的映射
  2. 部署后,创建部署AuctionFactory 合约并保存地址

拍卖行

  1. 根据命令部署一个拍卖合约,项目是指定的 ERC721 代币

拍卖

  1. 包含拍卖的所有逻辑
  2. 继承自 Wallet,允许操作合约中的 mapping 状态变量,将赢得的 ERC721 代币放入赢家钱包

问题是 Auction 不能从 Wallet 继承。当 AuctionFactory 尝试部署拍卖时,编译器将抛出错误 - 无法创建派生或相同合约的实例。这对我来说很有意义,因为 Wallet 部署了工厂,如果工厂部署了一个继承自 WalletAuction,它在技术上部署了它的母契约(Contract)。

所以我的问题是,我该如何构建这套契约(Contract)?我如何允许拍卖合约的实例与另一合约上的商店进行通信和操作?

最佳答案

这是一个可以存入代币然后拍卖它们的示例合约。这是一个基本的拍卖模型,显示了转移代币所有权的控制流程。

这是设置。首先,我们必须导入 ERC-721 header 。为此,我正在使用 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];
}

以上是该项目的一个功能齐全的起点。

关于ethereum - 拍卖完成后将 ERC721 代币推送到钱包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49718154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com