From 9e40d4ed4f0e67366646f3dea00292636b18db59 Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Fri, 27 Jun 2025 21:39:38 +0300 Subject: [PATCH] tests of the burning functionality Signed-off-by: Uncle Fatso --- src/mocks/Reserve.sol | 2 +- test/tokens/Reserve.t.sol | 104 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/mocks/Reserve.sol b/src/mocks/Reserve.sol index 52a8d1e..dd1cf81 100644 --- a/src/mocks/Reserve.sol +++ b/src/mocks/Reserve.sol @@ -57,7 +57,7 @@ contract Reserve is ERC20Permit { _mint(account, msg.value * conversionRate); } - function burn(uint256 amount) external payable { + function burn(uint256 amount) external { _burn(msg.sender, amount); uint256 valueDiff = address(this).balance - accumulatedDonation; uint256 valueBack = amount * valueDiff / (amount + totalSupply()); diff --git a/test/tokens/Reserve.t.sol b/test/tokens/Reserve.t.sol index daa949f..bd3a613 100644 --- a/test/tokens/Reserve.t.sol +++ b/test/tokens/Reserve.t.sol @@ -150,6 +150,28 @@ contract ReserveTest is Test { assertEq(faucetAddress.balance, sendAmount); } + function test_withdraw_onlyAccumulatedDonationsCouldBeWithdrawn() public { + assertEq(address(reserve).balance, 0); + vm.prank(initializer); + reserve.changeDonationRate(5 * 1e4); // 50% + + deal(aliceAddress, sendAmount); + vm.prank(aliceAddress); + reserve.mint{ value: sendAmount }(aliceAddress); + + assertEq(address(reserve).balance, sendAmount); + + vm.prank(initializer); + reserve.withdraw(payable(faucetAddress)); + assertEq(address(reserve).balance, sendAmount / 2); + assertEq(faucetAddress.balance, sendAmount / 2); + + vm.prank(initializer); + reserve.withdraw(payable(faucetAddress)); + assertEq(address(reserve).balance, sendAmount / 2); + assertEq(faucetAddress.balance, sendAmount / 2); + } + function test_withdraw_couldNotBeDoneByArbitraryAddress() public { assertEq(address(reserve).balance, 0); @@ -166,4 +188,86 @@ contract ReserveTest is Test { assertEq(address(reserve).balance, sendAmount); assertEq(aliceAddress.balance, 0); } + + function test_burn_shouldReturnFullAmountIfRateNotSet() public { + deal(aliceAddress, sendAmount); + vm.prank(aliceAddress); + reserve.mint{ value: sendAmount }(aliceAddress); + + uint256 balance = reserve.balanceOf(aliceAddress); + assertEq(reserve.totalSupply(), sendAmount * conversionRate); + assertEq(reserve.totalSupply(), balance); + assertEq(reserve.accumulatedDonation(), 0); + assertEq(aliceAddress.balance, 0); + + vm.prank(aliceAddress); + reserve.burn(balance); + + assertEq(reserve.totalSupply(), 0); + assertEq(reserve.balanceOf(aliceAddress), 0); + assertEq(reserve.accumulatedDonation(), 0); + assertEq(aliceAddress.balance, sendAmount); + } + + function test_burn_shouldTakeDonationInAccordanceToRate() public { + vm.prank(initializer); + reserve.changeDonationRate(5 * 1e4); // 50% + + deal(aliceAddress, sendAmount); + vm.prank(aliceAddress); + reserve.mint{ value: sendAmount }(aliceAddress); + + uint256 balance = reserve.balanceOf(aliceAddress); + assertEq(reserve.totalSupply(), sendAmount * conversionRate); + assertEq(reserve.totalSupply(), balance); + assertEq(reserve.accumulatedDonation(), sendAmount / 2); + assertEq(aliceAddress.balance, 0); + + vm.prank(aliceAddress); + reserve.burn(balance); + + assertEq(reserve.totalSupply(), 0); + assertEq(reserve.balanceOf(aliceAddress), 0); + assertEq(reserve.accumulatedDonation(), sendAmount / 2); + assertEq(aliceAddress.balance, sendAmount / 2); + } + + function test_burn_multipleUsersAccumulateInTotal() public { + vm.prank(initializer); + reserve.changeDonationRate(5 * 1e4); // 50% + + deal(aliceAddress, sendAmount); + vm.prank(aliceAddress); + reserve.mint{ value: sendAmount }(aliceAddress); + + vm.prank(initializer); + reserve.changeRate(conversionRate * 9); + + deal(bobAddress, sendAmount); + vm.prank(bobAddress); + reserve.mint{ value: sendAmount }(bobAddress); + + assertEq(aliceAddress.balance, 0); + assertEq(bobAddress.balance, 0); + uint256 aliceBalance = reserve.balanceOf(aliceAddress); + uint256 bobBalance = reserve.balanceOf(bobAddress); + + uint256 bobEstimation = reserve.estimateAmount(bobBalance); + uint256 aliceEstimation = reserve.estimateAmount(aliceBalance); + + vm.prank(bobAddress); + reserve.burn(bobBalance); + + vm.prank(aliceAddress); + reserve.burn(aliceBalance); + + assertEq(bobAddress.balance, sendAmount * 9 / 10); + assertEq(bobAddress.balance, bobEstimation); + assertEq(aliceAddress.balance, sendAmount / 10); + assertEq(aliceAddress.balance, aliceEstimation); + + assertEq(reserve.totalSupply(), 0); + assertEq(reserve.accumulatedDonation(), sendAmount); + assertEq(address(reserve).balance, sendAmount); + } }