Faucet burns wrong amount
Description
function burnFaucetTokens(uint256 amountToBurn) public onlyOwner {
require(amountToBurn <= balanceOf(address(this)), "Faucet Token Balance: Insufficient");
@> _transfer(address(this), msg.sender, balanceOf(address(this)));
@> _burn(msg.sender, amountToBurn);
}
Risk
Likelihood (high):
Impact:
Proof of Concept
Owner tries to burn only 1 $RB from faucet, but ends up with all tokens in her wallet and faucet remaining token balance is 0
function test_burnFaucetTokens_WhenBurningASingleTokenAllFaucetBalanceIsTransferred() public {
uint256 initialFaucetTokenBalance = raiseBoxFaucet.balanceOf(address(raiseBoxFaucet));
console.log("Initial faucet token balance:", initialFaucetTokenBalance);
vm.prank(owner);
raiseBoxFaucet.burnFaucetTokens(1 * 10 ** 18);
uint256 remainingFaucetTokenBalance = raiseBoxFaucet.balanceOf(address(raiseBoxFaucet));
console.log("Remaining faucet token balance:", remainingFaucetTokenBalance);
assertEq(remainingFaucetTokenBalance, 0);
uint256 ownerTokenBalance = raiseBoxFaucet.balanceOf(owner);
console.log("Owner's token balance:", ownerTokenBalance);
assertEq(ownerTokenBalance, initialFaucetTokenBalance - 1 * 10 ** 18);
}
Recommended Mitigation
- remove this code
+ add this code
/// @notice Burns faucet tokens held by the contract
- /// @dev Transfers tokens to owner first, then burns from owner
/// @param amountToBurn Amount of tokens to burn
function burnFaucetTokens(uint256 amountToBurn) public onlyOwner {
require(amountToBurn <= balanceOf(address(this)), "Faucet Token Balance: Insufficient");
- // transfer faucet balance to owner first before burning
- // ensures owner has a balance before _burn (owner only function) can be called successfully
- _transfer(address(this), msg.sender, balanceOf(address(this)));
- _burn(msg.sender, amountToBurn);
+ _burn(address(this), amountToBurn);
}