function list(uint256 _tokenId, uint32 _price) external onlyWhitelisted {
listingsCounter++;
activeListingsCounter++;
s_listings[_tokenId] = Listing({...});
emit NFT_Dealers_Listed(msg.sender, listingsCounter);
}
function buy(uint256 _listingId) external payable {
Listing memory listing = s_listings[_listingId];
if (!listing.isActive) revert ListingNotActive(_listingId);
}
pragma solidity ^0.8.34;
import {Test, console2} from "forge-std/Test.sol";
import {NFTDealers} from "../src/NFTDealers.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MockUSDC is ERC20 {
constructor() ERC20("USD Coin", "USDC") {}
function mint(address to, uint256 amount) external { _mint(to, amount); }
function decimals() public pure override returns (uint8) { return 6; }
}
contract ListingIdMismatchTest is Test {
NFTDealers dealers;
MockUSDC usdc;
address owner = makeAddr("owner");
address bob = makeAddr("bob");
address buyer = makeAddr("buyer");
uint256 constant LOCK = 20e6;
function setUp() public {
usdc = new MockUSDC();
dealers = new NFTDealers(owner, address(usdc), "Dealers", "DEAL", "ipfs://", LOCK);
vm.startPrank(owner);
dealers.revealCollection();
dealers.whitelistWallet(bob);
vm.stopPrank();
usdc.mint(bob, 500e6);
vm.prank(bob);
usdc.approve(address(dealers), type(uint256).max);
usdc.mint(buyer, 500e6);
vm.prank(buyer);
usdc.approve(address(dealers), type(uint256).max);
vm.prank(owner);
dealers.whitelistWallet(makeAddr("filler"));
usdc.mint(makeAddr("filler"), 100e6);
vm.prank(makeAddr("filler"));
usdc.approve(address(dealers), type(uint256).max);
vm.prank(makeAddr("filler"));
dealers.mintNft();
}
function test_listingIdMismatchBreaksBuy() public {
vm.startPrank(bob);
dealers.mintNft();
dealers.list(2, 50e6);
vm.stopPrank();
vm.prank(buyer);
vm.expectRevert(abi.encodeWithSelector(NFTDealers.ListingNotActive.selector, 1));
dealers.buy(1);
vm.prank(buyer);
dealers.buy(2);
assertEq(dealers.ownerOf(2), buyer);
}
}
function list(uint256 _tokenId, uint32 _price) external onlyWhitelisted {
require(_price >= MIN_PRICE, "Price must be at least 1 USDC");
require(ownerOf(_tokenId) == msg.sender, "Not owner of NFT");
- require(s_listings[_tokenId].isActive == false, "NFT is already listed");
require(_price > 0, "Price must be greater than 0");
listingsCounter++;
activeListingsCounter++;
- s_listings[_tokenId] =
+ s_listings[listingsCounter] =
Listing({seller: msg.sender, price: _price, nft: address(this), tokenId: _tokenId, isActive: true});
emit NFT_Dealers_Listed(msg.sender, listingsCounter);
}