pragma solidity ^0.8.0;
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
contract SimpleSwap {
address public owner;
IERC20 public token;
uint256 public rate;
constructor(address _tokenAddress, uint256 _rate) {
owner = msg.sender;
token = IERC20(_tokenAddress);
rate = _rate;
}
receive() external payable {
uint256 tokenAmount = msg.value * rate;
require(token.transfer(msg.sender, tokenAmount), "Token transfer failed");
}
function swapTokenForETH(uint256 tokenAmount) external {
uint256 ethAmount = tokenAmount / rate;
require(address(this).balance >= ethAmount, "Not enough ETH in contract");
require(token.transferFrom(msg.sender, address(this), tokenAmount), "Token transfer failed");
(bool success, ) = msg.sender.call{value: ethAmount}("");
require(success, "ETH transfer failed");
}
function withdrawETH() external {
require(msg.sender == owner, "Not owner");
payable(owner).transfer(address(this).balance);
}
function withdrawTokens() external {
require(msg.sender == owner, "Not owner");
uint256 balance = tokenBalance();
require(token.transfer(owner, balance), "Token withdrawal failed");
}
function tokenBalance() public view returns (uint256) {
return token.balanceOf(address(this));
}
}