From 5541eda1381b8f22169c73e90cf96f7f080f0881 Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Fri, 27 Jun 2025 20:16:10 +0300 Subject: [PATCH] additional logic for burning reserve in exchange of native; initial draft Signed-off-by: Uncle Fatso --- src/mocks/Reserve.sol | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/mocks/Reserve.sol b/src/mocks/Reserve.sol index 5d3455e..fa3a1dd 100644 --- a/src/mocks/Reserve.sol +++ b/src/mocks/Reserve.sol @@ -5,7 +5,9 @@ import "@openzeppelin-contracts/token/ERC20/extensions/ERC20Permit.sol"; contract Reserve is ERC20Permit { address private immutable _owner; + uint256 public accumulatedDonation; uint256 public conversionRate; + uint256 public donationRate; error OnlyOwner(); constructor( @@ -30,9 +32,14 @@ contract Reserve is ERC20Permit { conversionRate = rate; } + function changeReminder(uint256 reminder) external { + if (msg.sender != _owner) revert OnlyOwner(); + donationRate = reminder; + } + function withdraw(address payable receiver) external { if (msg.sender != _owner) revert OnlyOwner(); - (bool sent,) = receiver.call{ value: address(this).balance }(""); + (bool sent,) = receiver.call{ value: accumulatedDonation }(""); require(sent, "Failed to send Ether"); } @@ -42,10 +49,27 @@ contract Reserve is ERC20Permit { } function mint(address account) external payable { + uint256 donation = msg.value * donationRate / 1e5; + accumulatedDonation += donation; _innerMint(account, msg.value); } + function burn(uint256 amount) external payable { + (bool sent,) = msg.sender.call{ value: estimateAmount(amount) }(""); + require(sent, "Failed to send Ether"); + _innerBurn(msg.sender, amount); + } + + function estimateAmount(uint256 amount) public view returns (uint256) { + uint256 valueDiff = address(this).balance - accumulatedDonation; + return amount * valueDiff / totalSupply(); + } + function _innerMint(address who, uint256 amount) internal { _mint(who, amount * conversionRate); } + + function _innerBurn(address who, uint256 amount) internal { + _burn(who, amount); + } }