Created
April 12, 2024 00:06
-
-
Save yuyasugano/5f27983e0c5d0b1d3b47c969b1763b9c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.20; | |
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; | |
import "@openzeppelin/contracts/utils/Counters.sol"; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; | |
contract Marketplace is ReentrancyGuard, Ownable { | |
using Counters for Counters.Counter; | |
// マーケットプレイスのアイテム数 | |
Counters.Counter private marketplaceIds; | |
// マーケットプレイスでの売却済みアイテム数 | |
Counters.Counter private totalMarketplaceItemsSold; | |
mapping(uint => Listing) private marketplaceIdToListingItem; | |
// NFT を出品するための構造体 | |
struct Listing { | |
uint marketplaceId; | |
address nftAddress; | |
uint tokenId; | |
address payable seller; | |
address payable owner; | |
uint listPrice; | |
} | |
function createListing( | |
uint tokenId, | |
address nftAddress, | |
uint price | |
) public nonReentrant { | |
require(price > 0, "List price must be 1 wei >="); | |
marketplaceIds.increment(); | |
uint marketplaceItemId = marketplaceIds.current(); | |
marketplaceIdToListingItem[marketplaceItemId] = Listing( | |
marketplaceItemId, | |
nftAddress, | |
tokenId, | |
payable(msg.sender), | |
payable(address(0)), | |
price | |
); | |
// NFTコントラクトから対象のtokenIdのNFTをマーケットプレイスに移転する | |
IERC721(nftAddress).transferFrom(msg.sender, address(this), tokenId); | |
} | |
function buyListing(uint marketplaceItemId, address nftAddress) | |
public | |
payable | |
nonReentrant | |
{ | |
uint price = marketplaceIdToListingItem[marketplaceItemId].listPrice; | |
require( | |
msg.value == price, | |
"Value sent does not meet list price for NFT" | |
); | |
uint tokenId = marketplaceIdToListingItem[marketplaceItemId].tokenId; | |
marketplaceIdToListingItem[marketplaceItemId].seller.transfer(msg.value); | |
// マーケットプレイスから対象のtokenIdのNFTを購入者に移転する | |
IERC721(nftAddress).transferFrom(address(this), msg.sender, tokenId); | |
// 対象のマーケットプレイス出品アイテムの所有者情報を書き換え | |
marketplaceIdToListingItem[marketplaceItemId].owner = payable(msg.sender); | |
totalMarketplaceItemsSold.increment(); | |
} | |
function getMarketItem(uint marketplaceItemId) | |
public | |
view | |
returns (Listing memory) | |
{ | |
return marketplaceIdToListingItem[marketplaceItemId]; | |
} | |
function getMyListedNFTs() public view returns (Listing[] memory) { | |
uint totalListingCount = marketplaceIds.current(); | |
uint listingCount = 0; | |
uint index = 0; | |
for (uint i = 0; i < totalListingCount; i++) { | |
// 所有者が msg.sender に合致する出品アイテム数を格納 | |
if (marketplaceIdToListingItem[i + 1].owner == msg.sender) { | |
listingCount += 1; | |
} | |
} | |
Listing[] memory items = new Listing[](listingCount); | |
for (uint i = 0; i < totalListingCount; i++) { | |
if (marketplaceIdToListingItem[i + 1].owner == msg.sender) { | |
uint currentId = marketplaceIdToListingItem[i + 1].marketplaceId; | |
Listing memory currentItem = marketplaceIdToListingItem[currentId]; | |
items[index] = currentItem; | |
index += 1; | |
} | |
} | |
return items; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment