diff --git a/.gas-report b/.gas-report index ccc1c5e..bb63b24 100644 --- a/.gas-report +++ b/.gas-report @@ -8,18 +8,19 @@ | approveAndCall | 0 | 31201 | 0 | 93603 | 3 | | balanceOf | 0 | 285 | 0 | 2753 | 51 | | balanceOfAt | 0 | 90 | 0 | 2363 | 26 | -| changeController | 0 | 634 | 0 | 3558 | 8 | +| changeController | 0 | 507 | 0 | 3558 | 10 | | claimTokens | 9537 | 41281 | 57154 | 57154 | 3 | -| controller | 0 | 0 | 0 | 0 | 7 | +| controller | 0 | 0 | 0 | 0 | 8 | | createCloneToken | 0 | 924533 | 924533 | 1849066 | 2 | -| decimals | 0 | 0 | 0 | 0 | 7 | +| decimals | 0 | 0 | 0 | 0 | 8 | | destroyTokens | 2308 | 5206 | 4310 | 9001 | 3 | | enableTransfers | 0 | 0 | 0 | 0 | 3 | | generateTokens | 0 | 7184 | 0 | 95808 | 40 | -| name | 0 | 0 | 0 | 0 | 7 | -| parentSnapShotBlock | 0 | 0 | 0 | 0 | 8 | -| parentToken | 0 | 0 | 0 | 0 | 8 | -| symbol | 0 | 0 | 0 | 0 | 7 | +| name | 0 | 0 | 0 | 0 | 8 | +| parentSnapShotBlock | 0 | 0 | 0 | 0 | 9 | +| parentToken | 0 | 0 | 0 | 0 | 9 | +| receive | 7960 | 7979 | 7979 | 7998 | 2 | +| symbol | 0 | 0 | 0 | 0 | 8 | | totalSupply | 0 | 212 | 0 | 1911 | 9 | | totalSupplyAt | 0 | 285 | 0 | 1995 | 7 | | transfer | 526 | 38443 | 50395 | 75193 | 18 | diff --git a/.gas-snapshot b/.gas-snapshot index 9737c76..b4bee36 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -22,6 +22,9 @@ GenerateTokensTest:testGenerateTokens() (gas: 109518) GenerateTokensTest:testGenerateTokensSupplyOverflow() (gas: 3126) GenerateTokensTest:test_RevertWhen_SenderIsNotController() (gas: 14951) MiniMeTokenTest:testDeployment() (gas: 26535) +ReceiveTest:testAcceptingEther() (gas: 18628) +ReceiveTest:testDeployment() (gas: 26595) +ReceiveTest:testRejectingEther() (gas: 18691) ReentrancyTest:testAttack() (gas: 229394) TransferTest:testDeployment() (gas: 26617) TransferTest:testDoubleTransfer() (gas: 92425) diff --git a/test/MiniMeToken.t.sol b/test/MiniMeToken.t.sol index df76ab9..78e757e 100644 --- a/test/MiniMeToken.t.sol +++ b/test/MiniMeToken.t.sol @@ -62,6 +62,22 @@ contract MiniMeTokenTest is Test { } } +contract AcceptingController is TokenController { + receive() external payable { } + + function proxyPayment(address) public payable override returns (bool) { + return true; + } + + function onTransfer(address, address, uint256) public pure override returns (bool) { + return true; + } + + function onApprove(address, address, uint256) public pure override returns (bool) { + return true; + } +} + contract RejectingController is TokenController { function proxyPayment(address) public payable override returns (bool) { return false; @@ -76,6 +92,52 @@ contract RejectingController is TokenController { } } +contract ReceiveTest is MiniMeTokenTest { + function setUp() public virtual override { + MiniMeTokenTest.setUp(); + } + + function testAcceptingEther() public { + vm.pauseGasMetering(); + AcceptingController acceptingController = new AcceptingController(); + vm.prank(deployer); + minimeToken.changeController(payable(address(acceptingController))); + + vm.deal(address(accounts[0]), 10 ether); + vm.startPrank(address(accounts[0])); + vm.resumeGasMetering(); + (bool result,) = payable(address(minimeToken)).call{ value: 1 ether }(""); + vm.pauseGasMetering(); + vm.stopPrank(); + + assertTrue(result, "ether transfer should be successful"); + assertEq(address(minimeToken).balance, 0, "minimeToken balance should be correct"); + assertEq(address(acceptingController).balance, 1 ether, "acceptingController balance should be correct"); + assertEq(address(accounts[0]).balance, 9 ether, "account balance should be correct"); + vm.resumeGasMetering(); + } + + function testRejectingEther() public { + vm.pauseGasMetering(); + RejectingController rejectingController = new RejectingController(); + vm.prank(deployer); + minimeToken.changeController(payable(address(rejectingController))); + + vm.deal(address(accounts[0]), 10 ether); + vm.startPrank(address(accounts[0])); + vm.resumeGasMetering(); + (bool result,) = payable(address(minimeToken)).call{ value: 1 ether }(""); + vm.pauseGasMetering(); + vm.stopPrank(); + + assertFalse(result, "ether transfer should be rejected"); + assertEq(address(minimeToken).balance, 0, "minimeToken balance should be correct"); + assertEq(address(rejectingController).balance, 0, "rejectingController balance should be correct"); + assertEq(address(accounts[0]).balance, 10 ether, "account balance should be correct"); + vm.resumeGasMetering(); + } +} + contract GenerateTokensTest is MiniMeTokenTest { function setUp() public virtual override { MiniMeTokenTest.setUp();