diff --git a/.gas-report b/.gas-report index 9ca57a6..7b2ea4b 100644 --- a/.gas-report +++ b/.gas-report @@ -3,26 +3,26 @@ | Deployment Cost | Deployment Size | | | | | | 1793495 | 9955 | | | | | | Function Name | min | avg | median | max | # calls | -| allowance | 0 | 67 | 0 | 808 | 12 | -| approve | 0 | 15995 | 23208 | 31708 | 9 | +| allowance | 0 | 62 | 0 | 808 | 13 | +| approve | 0 | 15018 | 14715 | 31708 | 10 | | approveAndCall | 0 | 31199 | 0 | 93597 | 3 | -| balanceOf | 0 | 323 | 0 | 2753 | 45 | +| balanceOf | 0 | 309 | 0 | 2753 | 47 | | balanceOfAt | 0 | 90 | 0 | 2363 | 26 | -| changeController | 0 | 1014 | 758 | 3558 | 5 | +| changeController | 0 | 724 | 0 | 3558 | 7 | | claimTokens | 9537 | 41277 | 57148 | 57148 | 3 | | controller | 0 | 0 | 0 | 0 | 7 | | createCloneToken | 0 | 919122 | 919122 | 1838245 | 2 | | decimals | 0 | 0 | 0 | 0 | 7 | | destroyTokens | 9001 | 9001 | 9001 | 9001 | 1 | | enableTransfers | 0 | 0 | 0 | 0 | 3 | -| generateTokens | 0 | 8979 | 0 | 95796 | 32 | +| generateTokens | 0 | 8450 | 0 | 95796 | 34 | | name | 0 | 0 | 0 | 0 | 7 | | parentSnapShotBlock | 0 | 0 | 0 | 0 | 8 | | parentToken | 0 | 0 | 0 | 0 | 8 | | symbol | 0 | 0 | 0 | 0 | 7 | | totalSupply | 0 | 273 | 0 | 1911 | 7 | | totalSupplyAt | 0 | 285 | 0 | 1995 | 7 | -| transfer | 526 | 36631 | 40486 | 75187 | 16 | +| transfer | 526 | 37564 | 49389 | 75187 | 17 | | transferFrom | 0 | 16836 | 3495 | 66590 | 7 | diff --git a/.gas-snapshot b/.gas-snapshot index f10d670..0c4023a 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,10 +1,11 @@ -AllowanceTest:testAllowance() (gas: 42689) +AllowanceTest:testAllowance() (gas: 42712) AllowanceTest:testAllowanceAlreadySet() (gas: 36809) -AllowanceTest:testAllowanceReset() (gas: 45943) +AllowanceTest:testAllowanceReset() (gas: 45925) AllowanceTest:testApproveAndCall() (gas: 98516) AllowanceTest:testApproveTransferDisabled() (gas: 7968) AllowanceTest:testDeployment() (gas: 26711) AllowanceTest:testNoAllowance() (gas: 9462) +AllowanceTest:testRejectedApproval() (gas: 13643) ClaimTokensTest:testClaimERC20() (gas: 63734) ClaimTokensTest:testClaimETH() (gas: 13637) ClaimTokensTest:testClaimSelf() (gas: 61216) @@ -22,10 +23,11 @@ ReentrancyTest:testAttack() (gas: 229376) TransferTest:testDeployment() (gas: 26617) TransferTest:testDoubleTransfer() (gas: 92391) TransferTest:testDoubleTransfer2() (gas: 70610) -TransferTest:testInvalidDestinationTransfer() (gas: 6380) +TransferTest:testInvalidDestinationTransfer() (gas: 6402) TransferTest:testInvalidDestinationTransfer2() (gas: 6399) TransferTest:testMultipleTransferToSame() (gas: 114643) TransferTest:testMultipleTransferToSame2() (gas: 92818) +TransferTest:testRejectedTransfer() (gas: 59915) TransferTest:testTransfer() (gas: 81690) TransferTest:testTransfer2() (gas: 59888) TransferTest:testTransferDisabled() (gas: 7968) diff --git a/test/MiniMeToken.t.sol b/test/MiniMeToken.t.sol index b4ce223..07890dc 100644 --- a/test/MiniMeToken.t.sol +++ b/test/MiniMeToken.t.sol @@ -5,6 +5,7 @@ import { Test } from "forge-std/Test.sol"; import { Deploy } from "../script/Deploy.s.sol"; import { DeploymentConfig } from "../script/DeploymentConfig.s.sol"; +import { TokenController } from "../contracts/TokenController.sol"; import { NotAuthorized } from "../contracts/Controlled.sol"; import { TransfersDisabled, @@ -12,6 +13,7 @@ import { NotEnoughBalance, NotEnoughAllowance, AllowanceAlreadySet, + ControllerRejected, IERC20 } from "../contracts/MiniMeBase.sol"; import { MiniMeToken } from "../contracts/MiniMeToken.sol"; @@ -58,6 +60,20 @@ contract MiniMeTokenTest is Test { } } +contract RejectingController is TokenController { + function proxyPayment(address) public payable override returns (bool) { + return false; + } + + function onTransfer(address, address, uint256) public pure override returns (bool) { + return false; + } + + function onApprove(address, address, uint256) public pure override returns (bool) { + return false; + } +} + contract GenerateTokensTest is MiniMeTokenTest { function setUp() public virtual override { MiniMeTokenTest.setUp(); @@ -274,6 +290,22 @@ contract TransferTest is MiniMeTokenTest { assertEq(minimeToken.balanceOf(accounts[1]), 0, "balance of receiver shouldn't be increased"); vm.resumeGasMetering(); } + + function testRejectedTransfer() public { + vm.pauseGasMetering(); + address payable rejectingController = payable(address(new RejectingController())); + _generateTokens(accounts[0], 10); + vm.prank(deployer); + minimeToken.changeController(rejectingController); + vm.prank(accounts[0]); + vm.expectRevert(ControllerRejected.selector); + vm.resumeGasMetering(); + minimeToken.transfer(accounts[1], 2); + vm.pauseGasMetering(); + assertEq(minimeToken.balanceOf(accounts[0]), 10, "balance of sender shouldn't be reduced"); + assertEq(minimeToken.balanceOf(accounts[1]), 0, "balance of receiver shouldn't be increased"); + vm.resumeGasMetering(); + } } contract AllowanceTest is MiniMeTokenTest { @@ -408,6 +440,21 @@ contract AllowanceTest is MiniMeTokenTest { vm.stopPrank(); vm.resumeGasMetering(); } + + function testRejectedApproval() public { + vm.pauseGasMetering(); + address payable rejectingController = payable(address(new RejectingController())); + _generateTokens(accounts[0], 10); + vm.prank(deployer); + minimeToken.changeController(rejectingController); + vm.prank(accounts[0]); + vm.expectRevert(ControllerRejected.selector); + vm.resumeGasMetering(); + minimeToken.approve(accounts[1], 2); + vm.pauseGasMetering(); + assertEq(minimeToken.allowance(accounts[0], accounts[1]), 0, "allowance should be 0"); + vm.resumeGasMetering(); + } } contract ApproverAccount is ApproveAndCallFallBack {