diff --git a/src/mocks/Reserve.sol b/src/mocks/Reserve.sol index dd1cf81..6571679 100644 --- a/src/mocks/Reserve.sol +++ b/src/mocks/Reserve.sol @@ -20,11 +20,13 @@ contract Reserve is ERC20Permit { } fallback() external payable { - _mint(msg.sender, msg.value); + _accumulateDonation(msg.value); + _mint(msg.sender, msg.value * conversionRate); } receive() external payable { - _mint(msg.sender, msg.value); + _accumulateDonation(msg.value); + _mint(msg.sender, msg.value * conversionRate); } function changeRate(uint256 rate) external { @@ -52,8 +54,7 @@ contract Reserve is ERC20Permit { } function mint(address account) external payable { - uint256 donation = msg.value * donationRate / 1e5; - accumulatedDonation += donation; + _accumulateDonation(msg.value); _mint(account, msg.value * conversionRate); } @@ -70,4 +71,9 @@ contract Reserve is ERC20Permit { uint256 valueDiff = address(this).balance - accumulatedDonation; return amount * valueDiff / totalSupply(); } + + function _accumulateDonation(uint256 value) private { + uint256 donation = value * donationRate / 1e5; + accumulatedDonation += donation; + } } diff --git a/test/tokens/Reserve.t.sol b/test/tokens/Reserve.t.sol index bd3a613..d451985 100644 --- a/test/tokens/Reserve.t.sol +++ b/test/tokens/Reserve.t.sol @@ -270,4 +270,30 @@ contract ReserveTest is Test { assertEq(reserve.accumulatedDonation(), sendAmount); assertEq(address(reserve).balance, sendAmount); } + + function test_reserveFallback() public { + assertEq(address(reserve).balance, 0); + assertEq(reserve.balanceOf(aliceAddress), 0); + + vm.prank(aliceAddress); + (bool success, ) = address(reserve).call(abi.encodeWithSignature("nonExistentFunction()")); + require(success, "Fallback call failed"); + + assertEq(address(reserve).balance, 0); + assertEq(reserve.balanceOf(aliceAddress), 0); + } + + function test_reserveReceive() public { + assertEq(address(reserve).balance, 0); + assertEq(reserve.balanceOf(aliceAddress), 0); + + deal(aliceAddress, sendAmount); + vm.prank(aliceAddress); + (bool success, ) = address(reserve).call{value: sendAmount}(""); + require(success, "Transfer of native failed"); + + uint256 estimatedReceiveAmount = sendAmount * reserve.conversionRate(); + assertEq(address(reserve).balance, sendAmount); + assertEq(reserve.balanceOf(aliceAddress), estimatedReceiveAmount); + } }