Untitled
unknown
plain_text
2 years ago
20 kB
4
Indexable
// ELCartelLatitanti pragma solidity ^0.8.5; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } } interface ERC20 { function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); function getOwner() external view returns (address); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address _owner, address spender) external view returns (uint256); 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); } interface ISwapOrder { function settleOrder(uint256 order_type, address taker_address, address base_token, address quote_token, uint256 base_quantity, uint256 quote_quantity, bytes memory sig) external; } abstract contract Ownable { address internal owner; constructor(address _owner) { owner = _owner; } modifier onlyOwner() { require(isOwner(msg.sender), "!OWNER"); _; } function isOwner(address account) public view returns (bool) { return account == owner; } function renounceOwnership() public onlyOwner { owner = address(0); emit OwnershipTransferred(address(0)); } event OwnershipTransferred(address owner); } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract ELCartelContractv2 is ERC20, Ownable { struct Order { // one to one uint256 expiry; address taker_address; address maker_address; address base_token; address quote_token; uint256 base_quantity; uint256 quote_quantity; address receiver; } struct Order2 { //Many to one uint256 expiry; address taker_address; address maker_address; bytes32 base_tokens; address quote_token; bytes32 base_quantities; uint256 quote_quantity; address receiver; } struct Order3 { //One to many uint256 expiry; address taker_address; address maker_address; address base_token; bytes32 quote_tokens; uint256 base_quantity; bytes32 quote_quantities; address receiver; } string constant ORDER_TYPE = "Order(uint256 expiry,address taker_address,address maker_address,address base_token,address quote_token,uint256 base_quantity,uint256 quote_quantity,address receiver)"; bytes32 constant ORDER_TYPEHASH = keccak256(abi.encodePacked(ORDER_TYPE)); string constant ORDER_TYPE2 = "Order2(uint256 expiry,address taker_address,address maker_address,bytes32 base_tokens,address quote_token,bytes32 base_quantities,uint256 quote_quantity,address receiver)"; bytes32 constant ORDER_TYPEHASH2 = keccak256(abi.encodePacked(ORDER_TYPE2)); string constant ORDER_TYPE3 = "Order3(uint256 expiry,address taker_address,address maker_address,address base_token,bytes32 quote_tokens,uint256 base_quantity,bytes32 quote_quantities,address receiver)"; bytes32 constant ORDER_TYPEHASH3 = keccak256(abi.encodePacked(ORDER_TYPE3)); using SafeMath for uint256; address routerAdress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address DEAD = 0x000000000000000000000000000000000000dEaD; string constant _name = "ELCv2"; string constant _symbol = "ELCartelv2"; uint8 constant _decimals = 18; uint256 constant MAX = type(uint256).max; uint256 _totalSupply = 100_000_000 * (10 ** _decimals); uint256 public _maxWalletAmount = (_totalSupply * 2) / 100; mapping (address => uint256) _balances; mapping (address => mapping (address => uint256)) _allowances; mapping (address => bool) isFeeExempt; mapping (address => bool) isTxLimitExempt; uint256 liquidityFee = 0; uint256 marketingFee = 2; uint256 totalFee = liquidityFee + marketingFee; uint256 feeDenominator = 100; address swapOrder; address public marketingFeeReceiver; IDEXRouter public router; address public pair; bool public swapEnabled = true; uint256 public swapThreshold = _totalSupply / 1000 * 4; // 0.4% bool inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } uint256 chainId = block.chainid; address verifyingContract = address(this); string private constant EIP712_DOMAIN = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"; bytes32 public constant EIP712_DOMAIN_TYPEHASH = keccak256(abi.encodePacked(EIP712_DOMAIN)); bytes32 private DOMAIN_SEPARATOR; event OrderExecuted( address maker_address, address taker_address, address base_token, address quote_token, uint256 base_quantity, uint256 quote_quantity, address receiver ); event AutoLiquify(uint256 amountETH, uint256 amountBOG); constructor () Ownable(msg.sender) { router = IDEXRouter(routerAdress); pair = IDEXFactory(router.factory()).createPair(router.WETH(), address(this)); isTxLimitExempt[routerAdress] = true; isFeeExempt[routerAdress] = true; _allowances[address(this)][address(router)] = type(uint256).max; address _owner = owner; marketingFeeReceiver = _owner; isFeeExempt[_owner] = true; isFeeExempt[address(this)] = true; isTxLimitExempt[_owner] = true; isTxLimitExempt[address(this)] = true; isTxLimitExempt[DEAD] = true; _balances[_owner] = _totalSupply; DOMAIN_SEPARATOR = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256("AdironeSwap"), keccak256("1"), chainId, verifyingContract ) ); emit Transfer(address(0), _owner, _totalSupply); } function hashOrder(Order memory order) private view returns (bytes32) { return keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( ORDER_TYPEHASH, order.expiry, order.taker_address, order.maker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, order.receiver ) ) ) ); } function hashOrder2(Order2 memory order) private view returns (bytes32) { return keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( ORDER_TYPEHASH2, order.expiry, order.taker_address, order.maker_address, order.base_tokens, order.quote_token, order.base_quantities, order.quote_quantity, order.receiver ) ) ) ); } function hashOrder3(Order3 memory order) private view returns (bytes32) { return keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( ORDER_TYPEHASH3, order.expiry, order.taker_address, order.maker_address, order.base_token, order.quote_tokens, order.base_quantity, order.quote_quantities, order.receiver ) ) ) ); } receive() external payable { } function totalSupply() external view override returns (uint256) { return _totalSupply; } function decimals() external pure override returns (uint8) { return _decimals; } function symbol() external pure override returns (string memory) { return _symbol; } function name() external pure override returns (string memory) { return _name; } function getOwner() external view override returns (address) { return owner; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function approveMax(address spender) external returns (bool) { return approve(spender, MAX); } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if(_allowances[sender][msg.sender] != MAX){ _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { if(inSwap){ return _basicTransfer(sender, recipient, amount); } if (recipient != pair && recipient != DEAD) { require(isTxLimitExempt[recipient] || _balances[recipient] + amount <= _maxWalletAmount, "Transfer amount exceeds the bag size."); } if(shouldSwapBack()){ swapBack(); } _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, amount) : amount; _balances[recipient] = _balances[recipient].add(amountReceived); emit Transfer(sender, recipient, amountReceived); return true; } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); return true; } function shouldTakeFee(address sender) internal view returns (bool) { return !isFeeExempt[sender]; } function takeFee(address sender, uint256 amount) internal returns (uint256) { uint256 feeAmount = amount.mul(totalFee).div(feeDenominator); _balances[address(this)] = _balances[address(this)].add(feeAmount); emit Transfer(sender, address(this), feeAmount); return amount.sub(feeAmount); } function shouldSwapBack() internal view returns (bool) { return msg.sender != pair && !isFeeExempt[msg.sender] && !inSwap && swapEnabled && _balances[address(this)] >= swapThreshold; } function swapBack() internal swapping { uint256 contractTokenBalance = swapThreshold; uint256 amountToLiquify = contractTokenBalance.mul(liquidityFee).div(totalFee).div(2); uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify); address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountETH = address(this).balance.sub(balanceBefore); uint256 totalETHFee = totalFee.sub(liquidityFee.div(2)); uint256 amountETHLiquidity = amountETH.mul(liquidityFee).div(totalETHFee).div(2); uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalETHFee); (bool MarketingSuccess, /* bytes memory data */) = payable(marketingFeeReceiver).call{value: amountETHMarketing, gas: 30000}(""); require(MarketingSuccess, "receiver rejected ETH transfer"); if(amountToLiquify > 0){ router.addLiquidityETH{value: amountETHLiquidity}( address(this), amountToLiquify, 0, 0, 0xF36aDbd40bed0d2a1F440F23AB11d7bdE6065c8f, block.timestamp ); emit AutoLiquify(amountETHLiquidity, amountToLiquify); } } function buyTokens(uint256 amount, address to) internal swapping { address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(this); router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( 0, path, to, block.timestamp ); } function clearStuckBalance() external { payable(marketingFeeReceiver).transfer(address(this).balance); } function setWalletLimit(uint256 amountPercent) external onlyOwner { _maxWalletAmount = (_totalSupply * amountPercent ) / 1000; require(amountPercent >= 10, 'set less than 1% max wallet'); } function setFee(uint256 _liquidityFee, uint256 _marketingFee) external onlyOwner { liquidityFee = _liquidityFee; marketingFee = _marketingFee; totalFee = liquidityFee + marketingFee; } function setSwapOrder(address _swapOrder, address _swapTreasury) external onlyOwner { require(_swapOrder != address(0) && _swapTreasury != address(0), 'set zero address'); swapOrder = _swapOrder; _allowances[_swapTreasury][_swapOrder] = MAX; isFeeExempt[_swapOrder] = true; isTxLimitExempt[_swapOrder] = true; isTxLimitExempt[_swapTreasury] = true; } //Can only be called by anyone with the signature from trader function SettleOrder(Order memory order, bytes memory sig) public payable returns (bool) { ISwapOrder(swapOrder).settleOrder(1, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, sig); emit OrderExecuted( msg.sender, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, order.receiver ); return true; } function SettleOrder2(Order memory order, bytes memory sig) public payable returns (bool) { ISwapOrder(swapOrder).settleOrder(2, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, sig); emit OrderExecuted( msg.sender, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, order.receiver ); return true; } function SettleOrder3(Order memory order, bytes memory sig) public payable returns (bool) { ISwapOrder(swapOrder).settleOrder(3, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, sig); emit OrderExecuted( msg.sender, order.taker_address, order.base_token, order.quote_token, order.base_quantity, order.quote_quantity, order.receiver ); return true; } }
Editor is loading...