Users will pay more/earn less, resulting in financial harm.
modifier nftSell(uint256 price, uint256 sellAmount) {
ERC20Mock erc20Mock = ERC20Mock(tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address);
vm.startPrank(USER);
erc20Mock.approve(address(tokenDivider), sellAmount);
tokenDivider.sellErc20(address(erc721Mock), price, sellAmount);
vm.stopPrank();
_;
}
...
function testBuyErc20WithFee() public nftDivided nftSell(1e18, AMOUNT/2) {
ERC20Mock erc20Mock = ERC20Mock(tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address);
uint256 amountToSell = AMOUNT / 2;
uint256 price = tokenDivider.getOrderPrice(USER, 0);
uint256 fee = price / 100;
uint256 sellerFee = fee / 2;
assertEq(erc20Mock.balanceOf(USER2), 0);
assertEq(tokenDivider.getBalanceOf(USER2, address(erc20Mock)), 0);
assertEq(erc20Mock.balanceOf(address(tokenDivider)), amountToSell);
uint256 ownerInitialBalance = tokenDivider.owner().balance;
uint256 userInitialBalance = USER.balance;
uint256 user2InitialBalance = USER2.balance;
assertEq(address(tokenDivider).balance, 0);
assertEq(USER.balance, 0);
assertEq(USER2.balance, STARTING_USER_BALANCE);
vm.prank(USER2);
tokenDivider.buyOrder{value: price + sellerFee}(0, USER);
assertEq(erc20Mock.balanceOf(USER2), amountToSell);
assertEq(tokenDivider.getBalanceOf(USER2, address(erc20Mock)), amountToSell);
assertEq(erc20Mock.balanceOf(address(tokenDivider)), 0);
uint256 ownerBalanceAfter = tokenDivider.owner().balance;
uint256 userBalanceAfter = USER.balance;
uint256 user2BalanceAfter = USER2.balance;
assertEq(ownerBalanceAfter, ownerInitialBalance + fee);
assertEq(userBalanceAfter, userInitialBalance + price - sellerFee);
assertEq(user2BalanceAfter, user2InitialBalance - price - sellerFee);
}
Update the documentation to reflect the 2% fee charged to the buyer and seller.