// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {IBurnMintERC20Upgradeable} from "../../../../../shared/token/ERC20/upgradeable/IBurnMintERC20Upgradeable.sol"; import {IAccessControl} from "@openzeppelin/contracts@5.0.2/access/IAccessControl.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/interfaces/IERC20.sol"; import {ERC20UpgradableBaseTest} from "./ERC20UpgradableBaseTest.t.sol"; contract ERC20UpgradableBaseTest_burn is ERC20UpgradableBaseTest { function should_Burn( address implementation ) public { changePrank(i_mockPool); IBurnMintERC20Upgradeable(implementation).mint(STRANGER, AMOUNT); uint256 amountToBurn = AMOUNT / 2; changePrank(STRANGER); IBurnMintERC20Upgradeable(implementation).transfer(i_mockPool, amountToBurn); changePrank(i_mockPool); uint256 balanceBefore = IBurnMintERC20Upgradeable(implementation).balanceOf(i_mockPool); uint256 totalSupplyBefore = IBurnMintERC20Upgradeable(implementation).totalSupply(); vm.expectEmit(); emit IERC20.Transfer(i_mockPool, address(0), amountToBurn); IBurnMintERC20Upgradeable(implementation).burn(amountToBurn); assertEq(IBurnMintERC20Upgradeable(implementation).balanceOf(i_mockPool), balanceBefore - amountToBurn); assertEq(IBurnMintERC20Upgradeable(implementation).totalSupply(), totalSupplyBefore - amountToBurn); } function should_Burn_RevertWhen_CallerDoesNotHaveBurnerRole(address implementation, bytes32 BURNER_ROLE) public { changePrank(i_mockPool); IBurnMintERC20Upgradeable(implementation).mint(STRANGER, AMOUNT); changePrank(STRANGER); vm.expectRevert( abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, STRANGER, BURNER_ROLE) ); IBurnMintERC20Upgradeable(implementation).burn(AMOUNT); } }