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