/**
*Submitted for verification at Etherscan.io on 2021-02-16
*/
pragma solidity ^0.6.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(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);
}
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;
}
}
contract HEXA_DEX{
uint public tokenSellPrice=0.005 ether;
uint public tokenBuyPrice=0.007 ether;
uint public minBuy=10;
uint public maxBuy=1000;
uint public minSale=10;
uint public maxSale=50;
event Bought(address user,uint256 amount,uint price);
event Sold(address user,uint256 amount,uint price);
IERC20 public token;
address public owner;
constructor(IERC20 _hexa) public {
owner=msg.sender;
token = _hexa;
}
function buy(uint amount) payable public {
address _user=msg.sender;
uint32 size;
assembly {
size := extcodesize(_user)
}
require(size == 0, "cannot be a contract");
uint256 eVal=(amount*tokenBuyPrice);
require(msg.value>=eVal,"Invalid Amount");
uint256 dexBalance = token.balanceOf(address(this));
require(amount >=minBuy && amount <=maxBuy, "Check Quantity");
uint256 amountTobuy = amount*100000000;
require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
token.transfer(msg.sender, amountTobuy);
emit Bought(msg.sender,amount,tokenBuyPrice);
}
function sell(uint256 amount) public {
address _user=msg.sender;
uint32 size;
assembly {
size := extcodesize(_user)
}
require(size == 0, "cannot be a contract");
require(amount >=minSale && amount<=maxSale, "Check Quantity");
uint256 allowance = token.allowance(msg.sender, address(this));
uint256 amountToSell = amount*100000000;
require(allowance >= amountToSell, "Check the token allowance");
token.transferFrom(msg.sender, address(this), amountToSell);
uint256 eVal=(amount*tokenSellPrice);
msg.sender.transfer(eVal);
emit Sold(msg.sender,amount,tokenSellPrice);
}
function updateSetting(uint bprice, uint sprice, uint miBuy, uint mxBuy, uint miSell, uint mxSell) public
{
address _user=msg.sender;
uint32 size;
assembly {
size := extcodesize(_user)
}
require(size == 0, "cannot be a contract");
require(msg.sender==owner,"Only Owner");
if(bprice>0)
tokenBuyPrice=bprice;
if(sprice>0)
tokenSellPrice=sprice;
if(miBuy>0)
minBuy=miBuy;
if(mxBuy>0)
maxBuy=mxBuy;
if(miSell>0)
minSale=miSell;
if(mxSell>0)
maxSale=mxSell;
}
function withdrawBalance(uint _type, uint amt,address payable user) public
{
require(msg.sender==owner,"Only Owner");
require(_type==1 || _type==2, "Invalid Request");
if(_type==1)
{
user.transfer(amt);
}
else
{
token.transfer(user, amt);
}
}
}
{
"compilationTarget": {
"browser/hexa_dex.sol": "HEXA_DEX"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IERC20","name":"_hexa","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Sold","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bprice","type":"uint256"},{"internalType":"uint256","name":"sprice","type":"uint256"},{"internalType":"uint256","name":"miBuy","type":"uint256"},{"internalType":"uint256","name":"mxBuy","type":"uint256"},{"internalType":"uint256","name":"miSell","type":"uint256"},{"internalType":"uint256","name":"mxSell","type":"uint256"}],"name":"updateSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address payable","name":"user","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]