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); |         _mint(account, msg.value * conversionRate); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     function burn(uint256 amount) external payable { |     function burn(uint256 amount) external { | ||||||
|         _burn(msg.sender, amount); |         _burn(msg.sender, amount); | ||||||
|         uint256 valueDiff = address(this).balance - accumulatedDonation; |         uint256 valueDiff = address(this).balance - accumulatedDonation; | ||||||
|         uint256 valueBack = amount * valueDiff / (amount + totalSupply()); |         uint256 valueBack = amount * valueDiff / (amount + totalSupply()); | ||||||
|  | |||||||
| @ -150,6 +150,28 @@ contract ReserveTest is Test { | |||||||
|         assertEq(faucetAddress.balance, sendAmount); |         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 { |     function test_withdraw_couldNotBeDoneByArbitraryAddress() public { | ||||||
|         assertEq(address(reserve).balance, 0); |         assertEq(address(reserve).balance, 0); | ||||||
| 
 | 
 | ||||||
| @ -166,4 +188,86 @@ contract ReserveTest is Test { | |||||||
|         assertEq(address(reserve).balance, sendAmount); |         assertEq(address(reserve).balance, sendAmount); | ||||||
|         assertEq(aliceAddress.balance, 0); |         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