tests of the burning functionality
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									15dfd49163
								
							
						
					
					
						commit
						9e40d4ed4f
					
				| @ -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()); | ||||
|  | ||||
| @ -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); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user