modifier OnlyItemOwner(address tokenAddress, uint256 tokenId){
IERC721 tokenContract = IERC721(tokenAddress);
require(tokenContract.ownerOf(tokenId) == msg.sender);
_;
}
problem solved.I wrote here getapproved instead of ownerof but anyway that worked and i deployed my contract thats why i could not see the mistake. i run again truffle migrate --reset and i chanced all plugins with new contracts address and everything works fine. THANK YOU MORALIS , we learn many many things with you guys.
how did u find out that this is what u needed to change?
you can see that problem is with my contract , thats why even it could deploy i check the contract details , i could mint and approve but not list then i thought there should be problem with my events and i changed that as you can see, now works everything fine.
Hello, i have the same problem when i tried to sell some items (I have the same message in my metamask). I tried your solution (@aliekber1976) but it didn’t work.
Here is my code, any idea ?
Thank you !
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "/@openzeppelin/contracts/token/ERC721/IERC721.sol";
contract MorarableMarketContract {
struct AuctionItem {
uint256 id;
address tokenAddress;
uint256 tokenId;
address payable seller;
uint256 askingPrice;
bool isSold;
}
AuctionItem[] public itemsForSale;
mapping (address => mapping (uint256 => bool)) activeItems;
event itemAdded(uint256 id, uint256 tokenId, address tokenAddress, uint256 askingPrice);
event itemSold(uint256 id, address buyer, uint256 askingPrice);
modifier OnlyItemOwner(address tokenAddress, uint256 tokenId){
IERC721 tokenContract = IERC721(tokenAddress);
require(tokenContract.getApproved(tokenId) == msg.sender);
_;
}
modifier HasTransferApproval(address tokenAddress, uint256 tokenId){
IERC721 tokenContract = IERC721(tokenAddress);
require(tokenContract.getApproved(tokenId) == address(this));
_;
}
modifier ItemExists(uint256 id){
require(id < itemsForSale.length && itemsForSale[id].id == id, "Could not find item");
_;
}
modifier IsForSale(uint256 id){
require(itemsForSale[id].isSold == false, "Item is already sold!");
_;
}
function addItemToMarket(uint256 tokenId, address tokenAddress, uint256 askingPrice) OnlyItemOwner(tokenAddress,tokenId) HasTransferApproval(tokenAddress,tokenId) external returns (uint256){
require(activeItems[tokenAddress][tokenId] == false, "Item is already up for sale!");
uint256 newItemId = itemsForSale.length;
itemsForSale.push(AuctionItem(newItemId, tokenAddress, tokenId, payable(msg.sender), askingPrice, false));
activeItems[tokenAddress][tokenId] = true;
assert(itemsForSale[newItemId].id == newItemId);
emit itemAdded(newItemId, tokenId, tokenAddress, askingPrice);
return newItemId;
}
function buyItem(uint256 id) payable external ItemExists(id) IsForSale(id) HasTransferApproval(itemsForSale[id].tokenAddress,itemsForSale[id].tokenId){
require(msg.value >= itemsForSale[id].askingPrice, "Not enough funds sent");
require(msg.sender != itemsForSale[id].seller);
itemsForSale[id].isSold = true;
activeItems[itemsForSale[id].tokenAddress][itemsForSale[id].tokenId] = false;
IERC721(itemsForSale[id].tokenAddress).safeTransferFrom(itemsForSale[id].seller, msg.sender, itemsForSale[id].tokenId);
itemsForSale[id].seller.transfer(msg.value);
emit itemSold(id, msg.sender,itemsForSale[id].askingPrice);
}
}
here you should write instead of getApproved , ownerOf(tokenId). because it is itemowner function , as much as I understood , I hope it works
Thank you for your help but i still have the same error. I didn’t precise that i’m trying to run this on bscTestnet. Just like you i can deploy my contract, but when it comes to sell the item, there is the error.
If anyone has an idea, it would be very nice !
but did you deploy your market contract again and chance the contract address in your main.js ?
Hello guys, thank you for your advices. Finally it worked when i used remix.
I just have another question, currently i can make transfer of ownership between accounts, but i can set a real price, its possible to purchase and acquire an nft but there is no transfer of currency.
Do i have to change the marketplace contract ?
Thank you again for your help, i’m trying to launch a real project.
When i buy an NFT, the account that put for sale this NFT do not receive money and of course the account that bought the NFT is not debited. Is this clear ? thanks
Hey @nicklunik
Are you sure you need this feature? safeTransferFrom
is just a feature that the 721 standard has. Under normal conditions, no one uses it. Why do you need it on the marketplace?
After all, these are the settings of your specific NFT.
Yes! what i want to do is to be able to sell nft on the website. So i need to be able to transfer the ownership of the NFT and receive some money back.
I think you mean that even you bought item and eth transfered successfully, you dont see that in wallet. This might be cause of your codes work with Wei and you can not see that in your wallet. For example if you wanna put the item for 1 ETH , you should add 18 zeros. I hope it works
Ok thank you guys, I didn’t was aware of this step. I redeployed the contract with ‘ether’ in remix but i still have to add 18 zeros to get 1 bnb, anyway at least it’s working. I’ve have one final step, it’s to set up paiement only with my token (the token of the platform). I will try to find on my own and let you know when it’s live Thanks again, have a nice day guys !
i am glad that it works, I had same problem too , you should have to add web3.utils.toWei(sellItemPriceField, "ether")).send({from: userAddress})
in your main.js code. Have a nice day too