function burn(uint256 amount) external {
uint256 taxAmount = amount.percentMul(burnTaxRate);
# not all tokens are burned here
@> _burn(msg.sender, amount - taxAmount);
# if feeCollector == address(0) taxAmount will remain at the caller address
@> if (taxAmount > 0 && feeCollector != address(0)) {
_transfer(msg.sender, feeCollector, taxAmount);
}
}
pragma solidity 0.8.28;
import {Test} from "forge-std/Test.sol";
import {RAACToken} from "src/core/tokens/RAACToken.sol";
import {veRAACToken} from "src/core/tokens/veRAACToken.sol";
import {FeeCollector} from "src/core/collectors/FeeCollector.sol";
import {IFeeCollector} from "src/interfaces/core/collectors/IFeeCollector.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract TestRAACTokenBurn is Test {
RAACToken public raacToken;
FeeCollector public feeCollector;
function setUp() public {
raacToken = new RAACToken(address(this), 0, 0);
raacToken.setMinter(address(this));
veRAACToken veToken = new veRAACToken(address(raacToken));
feeCollector =
new FeeCollector(address(raacToken), address(veToken), address(this), address(this), address(this));
feeCollector.updateFeeType(0, IFeeCollector.FeeType(0, 10_000, 0, 0));
raacToken.manageWhitelist(address(feeCollector), true);
raacToken.manageWhitelist(address(veToken), true);
raacToken.manageWhitelist(address(this), true);
raacToken.mint(address(this), 10_000);
}
function test_raac_burn() public {
raacToken.setFeeCollector(address(0));
uint256 amount = 10_000;
assertEq(raacToken.balanceOf(address(feeCollector)), 0, "Fee collector should have 0 RAAC tokens");
raacToken.approve(address(feeCollector), amount);
feeCollector.collectFee(amount, 0);
assertEq(raacToken.balanceOf(address(feeCollector)), amount, "Fee collector should have 10_000 RAAC tokens");
vm.expectEmit(address(raacToken));
emit IERC20.Transfer({
from: address(feeCollector),
to: address(0),
value: amount
});
vm.expectEmit(address(feeCollector));
emit IFeeCollector.FeeDistributed({
veRAACAmount: 0,
burnAmount: amount,
repairAmount: 0,
treasuryAmount: 0
});
feeCollector.distributeCollectedFees();
assertEq(raacToken.balanceOf(address(feeCollector)), 0, "Fee collector should have 0 RAAC tokens");
}
}
Unburned tokens may introduce inflation to the system.
function burn(uint256 amount) external {
uint256 taxAmount = amount.percentMul(burnTaxRate);
+ if (taxAmount > 0 && feeCollector != address(0)) {
+ _transfer(msg.sender, feeCollector, taxAmount);
+ } else {
+ taxAmount = 0;
+ }
_burn(msg.sender, amount - taxAmount);
- if (taxAmount > 0 && feeCollector != address(0)) {
- _transfer(msg.sender, feeCollector, taxAmount);
- }
}