Created
October 27, 2021 16:03
-
-
Save omeganoob/ca268810f7f05505659a3eff836e6649 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.7+commit.e28d00a7.js&optimize=false&runs=200&gist=
This file contains hidden or 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.7; | |
import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; | |
import "@openzeppelin/contracts/utils/Counters.sol"; | |
import "@openzeppelin/contracts/access/Ownable.sol"; | |
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; | |
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; | |
import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; | |
contract MedChainMarket is ReentrancyGuard{ | |
using Counters for Counters.Counter; | |
Counters.Counter private _itemIds; | |
Counters.Counter private _itemsSold; | |
address payable owner; | |
constructor(){ | |
owner = payable(msg.sender); | |
} | |
struct MarketItem{ | |
uint itemId; | |
address nftContract; | |
uint256 tokenId; | |
address payable seller; | |
address payable owner; | |
uint256 price; | |
bool sold; | |
} | |
mapping(uint256 => MarketItem) private idToMarketItem; | |
event MarketItemCreated( | |
uint indexed itemID, | |
address indexed nftContract, | |
uint256 indexed tokenId, | |
address seller, | |
address owner, | |
uint256 price, | |
bool sold | |
); | |
function createMarketItem( | |
address nftContract, | |
uint256 tokenId, | |
uint256 price | |
) public payable nonReentrant returns (MarketItem memory) { | |
require(price > 0, "Price must be at least 1 wei"); | |
_itemIds.increment(); | |
uint256 itemId = _itemIds.current(); | |
idToMarketItem[itemId] = MarketItem( | |
itemId, | |
nftContract, | |
tokenId, | |
payable(msg.sender), | |
payable(address(0)), | |
price, | |
false | |
); | |
IERC721(nftContract).transferFrom(msg.sender, address(this), tokenId); | |
return idToMarketItem[itemId]; | |
} | |
function createMarketSale(address nftContract, uint256 itemId) | |
public payable nonReentrant{ | |
uint price = idToMarketItem[itemId].price; | |
uint tokenId = idToMarketItem[itemId].tokenId; | |
require(msg.value == price, "Please submit the asking price in order to complete the purchase"); | |
idToMarketItem[itemId].seller.transfer(msg.value); | |
IERC721(nftContract).transferFrom(address(this), msg.sender, tokenId); | |
idToMarketItem[itemId].owner = payable(msg.sender); | |
idToMarketItem[itemId].sold = true; | |
_itemsSold.increment(); | |
payable(owner).transfer(price); | |
} | |
function fetchMarketItems() | |
public view returns (MarketItem[] memory){ | |
uint itemCount = _itemIds.current(); | |
uint unsoldItemCount = _itemIds.current() - _itemsSold.current(); | |
uint currentIndex = 0; | |
MarketItem[] memory items = new MarketItem[](unsoldItemCount); | |
for(uint i = 0; i < itemCount; i++){ | |
if (idToMarketItem[i + 1].owner == address(0)){ | |
uint currentId = idToMarketItem[i + 1].itemId; | |
MarketItem storage currentItem = idToMarketItem[currentId]; | |
items[currentIndex] = currentItem; | |
currentIndex += 1; | |
} | |
} | |
return items; | |
} | |
function fetchMyNFTs() | |
public view returns (MarketItem[] memory){ | |
uint totalItemCount = _itemIds.current(); | |
uint itemCount = 0; | |
uint currentIndex = 0; | |
for(uint i = 0; i < totalItemCount; i++){ | |
if (idToMarketItem[i + 1].owner == msg.sender){ | |
itemCount += 1; | |
} | |
} | |
MarketItem[] memory items = new MarketItem[](itemCount); | |
for(uint i = 0; i < totalItemCount; i++){ | |
if (idToMarketItem[i + 1].owner == msg.sender){ | |
uint currentId = idToMarketItem[i + 1].itemId; | |
MarketItem storage currentItem = idToMarketItem[currentId]; | |
items[currentIndex] = currentItem; | |
currentIndex += 1; | |
} | |
} | |
return items; | |
} | |
function fetchItemsCreated() | |
public view returns (MarketItem[] memory){ | |
uint totalItemCount = _itemIds.current(); | |
uint itemCount = 0; | |
uint currentIndex = 0; | |
for(uint i = 0; i < totalItemCount; i++){ | |
if (idToMarketItem[i + 1].seller == msg.sender){ | |
itemCount += 1; | |
} | |
} | |
MarketItem[] memory items = new MarketItem[](itemCount); | |
for(uint i = 0; i < totalItemCount; i++){ | |
if (idToMarketItem[i + 1].seller == msg.sender){ | |
uint currentId = idToMarketItem[i + 1].itemId; | |
MarketItem storage currentItem = idToMarketItem[currentId]; | |
items[currentIndex] = currentItem; | |
currentIndex += 1; | |
} | |
} | |
return items; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment