pragma solidity ^0.8; import "https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import "https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; contract FixedSwap is ERC20 { address immutable token1; address immutable token2; uint public revenue; constructor(address _token1, address _token2, uint i1, uint i2) ERC20 ("FixedSwap", "FSW") { require(_token1 != _token2); token1 = _token1; token2 = _token2; SafeERC20.safeTransferFrom(IERC20(_token1), msg.sender, address(this), i1); SafeERC20.safeTransferFrom(IERC20(_token2), msg.sender, address(this), i2); _mint(msg.sender, i1 + i2); } function mint(address _token, uint amount) external { require((_token == token1) || (_token == token2)); SafeERC20.safeTransferFrom(IERC20(_token), msg.sender, address(this), amount); uint cost = 10**8 * totalBalance() / totalSupply(); _mint(msg.sender, amount * 10**8 / cost); } function burn(address _token, uint amount) external { require((_token == token1) || (_token == token2)); _burn(msg.sender, amount); uint cost = 10**8 * (totalBalance() + revenue) / totalSupply(); SafeERC20.safeTransfer(IERC20(_token), msg.sender, amount * cost / 10**8); } function swap(address _token, uint amount) external { require((_token == token1) || (_token == token2)); address otherToken = (_token == token1) ? token2 : token1; SafeERC20.safeTransferFrom(IERC20(_token), msg.sender, address(this), amount); uint amountOut = amount * 9998 / 10000; revenue += amount - amountOut; SafeERC20.safeTransfer(IERC20(otherToken), msg.sender, amountOut); } function totalBalance() public view returns (uint) { return ERC20(token1).balanceOf(address(this)) + ERC20(token2).balanceOf(address(this)); } }
0.4.18