pragma solidity 0.8.10;
library safeMath {
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
interface IERC20 {
function getAddress() external view returns (address);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address supender) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address owner, address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract ERC20Basic is IERC20 {
string public constant name = "ERC-xinChain";
string public constant symbol = "ERC-xin";
uint8 public constant decimals = 18;
mapping(address => uint256) balances;
mapping(address => mapping(address => uint256)) allowedBalence;
uint256 totalSupply_ = 10 ether;
using safeMath for uint256;
constructor () {
balances[msg.sender] = totalSupply_;
}
function getAddress() external view returns (address){
return address(this);
}
function totalSupply() external view returns (uint256){
return totalSupply_;
}
function balanceOf(address tokenOwner) public override view returns (uint256){
return balances[tokenOwner];
}
function transfer(address receiver, uint256 amount) public override returns (bool){
require(amount <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(amount);
balances[receiver] = balances[receiver].add(amount);
emit Transfer(msg.sender, receiver, amount);
return true;
}
function approve(address owner, address delegate, uint256 amount) external returns (bool){
allowedBalence[owner][delegate] = amount;
emit Approval(owner, delegate, amount);
return true;
}
function allowance(address owner, address delegate) external view returns (uint256){
return allowedBalence[owner][delegate];
}
function transferFrom(address owner, address buyer, uint256 amount) external returns (bool){
require(amount <= balances[owner]);
require(amount <= allowedBalence[owner][msg.sender]);
balances[owner] = balances[owner].sub(amount);
allowedBalence[owner][buyer] = allowedBalence[owner][buyer].sub(amount);
balances[buyer] = balances[buyer].add(amount);
emit Transfer(owner, buyer, amount);
return true;
}
}
contract DEX {
event Bought(uint256 amount);
event Sold(uint256 amount);
IERC20 public token;
constructor () {
token = new ERC20Basic();
}
function buy() payable public {
uint256 amountTobuy = msg.value;
uint256 dexBalance = token.balanceOf(address(this));
require(amountTobuy > 0 , "You need to send some Ethoer");
require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
token.transfer(msg.sender, amountTobuy);
emit Bought(amountTobuy);
}
function sell(uint256 amount) public {
require(amount > 0, "You need to sell at least some tokens.");
uint256 allowance = token.allowance(msg.sender, address(this));
require(allowance >= amount, "check the token allowance");
token.transferFrom(msg.sender, address(this), amount);
emit Sold(amount);
}
function getDexBalance() public view returns(uint256) {
return token.balanceOf(address(this));
}
function getOwnerBalance() public view returns(uint256) {
return token.balanceOf(msg.sender);
}
function getAddress() public view returns (address) {
return address(this);
}
function getTokenAddress() public view returns (address) {
return token.getAddress();
}
function getTotalSupply() public view returns (uint256) {
return token.totalSupply();
}
function getSenderAddress() public view returns (address) {
return address(msg.sender);
}
function getAllowance() public view returns (uint256) {
uint256 allowance = token.allowance(msg.sender, address(this));
return allowance;
}
function approve(uint256 amount) public returns(bool) {
bool isApprove = token.approve(msg.sender, address(this), amount);
return isApprove;
}
}