Hello i get this error when i try to implement
ERC721Enumerable
From solidity: TypeError: Derived contract must override function "_beforeTokenTransfer". Two or more base classes define function with same name and parameter types. --> astro-market.sol:11:1:
in my contract
this is my contract
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/finance/PaymentSplitter.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
contract NFTmarketplace is ERC721Enumerable , ERC721URIStorage, PaymentSplitter {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
Counters.Counter private _itemsSold;
uint256 listingPrice = 50 ether;
uint256 ownerCommissionPercentage = 15;
uint256 creatorCommissionPercentage = 1000 - ownerCommissionPercentage;
address payable owner;
mapping(uint256 => MarketItem) private idToMarketItem;
struct MarketItem {
uint256 tokenId;
address payable seller;
address payable owner;
uint256 price;
bool sold;
}
event MarketItemCreated (
uint256 indexed tokenId,
address seller,
address owner,
uint256 price,
bool sold
);
uint256[] private _teamShares = [100];
address[] private _team = [
0x46b04EAbfee4b33
];
constructor() ERC721("Astro Market", "ASTRO") PaymentSplitter(_team, _teamShares){
owner = payable(msg.sender);
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal {
// Your custom implementation here
}
function getOwnerShare(uint256 x) private view returns(uint256) {
return (x / 1000) * ownerCommissionPercentage;
}
function getCreatorShare(uint256 x) private view returns(uint256) {
return (x / 1000) * creatorCommissionPercentage;
}
function updateOwnerCommissionPercentage(uint _ownerCommissionPercentage) public payable {
require(owner == msg.sender, "Only marketplace owner can update the listing price");
ownerCommissionPercentage = _ownerCommissionPercentage;
}
function getOwnerCommissionPercentage() public view returns (uint256) {
return ownerCommissionPercentage;
}
function updateListingPrice(uint _listingPrice) public payable {
require(owner == msg.sender, "Only marketplace owner can update the listing price");
listingPrice = _listingPrice;
}
function getListingPrice() public view returns (uint256) {
return listingPrice;
}
function createToken(string memory tokenURI, uint256 price) public payable returns (uint) {
_tokenIds.increment();
uint256 newTokenId = _tokenIds.current();
_mint(msg.sender, newTokenId);
_setTokenURI(newTokenId, tokenURI);
createMarketItem(newTokenId, price);
return newTokenId;
}
function createMarketItem(uint256 tokenId, uint256 price) private {
require(price > 0, "Price must be at least 1");
require(msg.value == listingPrice, "Price must be equal to listing price");
idToMarketItem[tokenId] = MarketItem(
tokenId,
payable(msg.sender),
payable(address(this)),
price,
false
);
_transfer(msg.sender, address(this), tokenId);
emit MarketItemCreated(tokenId, msg.sender, address(this), price, false);
}
function resellToken(uint256 tokenId, uint256 price) public payable {
require(idToMarketItem[tokenId].owner == msg.sender, "Only Item Owner can perform this operation");
require(msg.value == listingPrice, "Price must be equal to listing price");
idToMarketItem[tokenId].sold = false;
idToMarketItem[tokenId].price = price;
idToMarketItem[tokenId].seller = payable(msg.sender);
idToMarketItem[tokenId].owner = payable(address(this));
_itemsSold.decrement();
_transfer(msg.sender, address(this), tokenId);
}
function createMarketSale(uint256 tokenId) public payable {
uint price = idToMarketItem[tokenId].price;
address payable creator = idToMarketItem[tokenId].seller;
require(msg.value == price, "Please submit the asking price to complete the purchase");
idToMarketItem[tokenId].owner = payable(msg.sender);
idToMarketItem[tokenId].sold = true;
idToMarketItem[tokenId].seller = payable(address(0));
_itemsSold.increment();
_transfer(address(this), msg.sender, tokenId);
payable(owner).transfer(listingPrice);
payable(owner).transfer(getOwnerShare(msg.value));
payable(creator).transfer(getCreatorShare(msg.value));
}
function fetchMarketItems() public view returns (MarketItem[] memory) {
uint itemCount = _tokenIds.current();
uint unsoldItemCount = _tokenIds.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(this)) {
uint currentId = i +1;
MarketItem storage currentItem = idToMarketItem[currentId];
items[currentIndex] = currentItem;
currentIndex += 1;
}
}
return items;
}
function fetchMyItems() public view returns (MarketItem[] memory) {
uint totalItemCount = _tokenIds.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 = i +1;
MarketItem storage currentItem = idToMarketItem[currentId];
items[currentIndex] = currentItem;
currentIndex += 1;
}
}
return items;
}
function fetchItemsListed() public view returns (MarketItem[] memory) {
uint totalItemCount = _tokenIds.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 = i +1;
MarketItem storage currentItem = idToMarketItem[currentId];
items[currentIndex] = currentItem;
currentIndex += 1;
}
}
return items;
}
}
Please how do i fix it