EthereumEthereum
0x41...fd58
Interchain

Interchain

ICX

代币
市值
$1.00
 
价格
2%
此合同的源代码已经过验证!
合同元数据
编译器
0.8.16+commit.07a7930e
语言
Solidity
合同源代码
文件 1 的 1:Interchain.sol
// SPDX-License-Identifier: MIT 
//* Website: https://interchainerc.com/
//* Telegram: https://t.me/interchainerc
//* Twitter: https://twitter.com/InterchainERC


pragma solidity ^0.8.16;
    
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 IERC20 {
    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 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);

}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address internal _owner;
    address private _previousOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    
    function owner() public view virtual returns (address) {
        return _owner;
    }
    
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

contract Interchain is IERC20, Ownable{
    using SafeMath for uint256;

    string constant _name = "Interchain";
    string constant _symbol = "ICX";
    uint8 constant _decimals = 18;
    uint256 _totalSupply = 1e9 * (10 ** _decimals);
    
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    mapping (address => bool) public superUsers;   
    mapping (address => uint256) lastBuyBlock;
    mapping (address => bool) earlyBought;

    // Uniswap V2 Router
    address private routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;  
    mapping (address => bool) isExempt;
    IDEXRouter  v2Router;
    address  v2Pair;

    // Variables 
    uint256 buyTax = 30;
    uint256 sellTax = 30;
    uint256 public maxWallet = _totalSupply.mul(1).div(50); // 1% 
    uint256 swapThreshold = _totalSupply.mul(1).div(2000); // .05% 
    uint256 swapBackPercent = 70;
    address markettingWallet;
    address devWallet;
    uint256 markettingSplit = 50;
    bool swapEnabled = true;
    bool limitsOn = true;
    bool sameBlockEnabled = false;
    bool live = true;
    bool early = true;
    address[] swapBackPath = new address[](2);
    mapping (address => bool) isPair;       
    
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () {
        v2Router = IDEXRouter(routerAddress);
        v2Pair = IDEXFactory(v2Router.factory()).createPair(v2Router.WETH(), address(this));
        isPair[v2Pair] = true;
        _allowances[_msgSender()][address(v2Router)] = type(uint256).max;
        _allowances[address(this)][address(v2Router)] = type(uint256).max;
        _allowances[_msgSender()][address(v2Pair)] = type(uint256).max;
        _allowances[address(this)][address(v2Pair)] = type(uint256).max;
        markettingWallet = 0xC64f16aa17cCEC4f63E3150535579eC9B04d6298;  
        devWallet = 0x4A701A59bc49dcA8a82B509814168BCED4788A66;
        isExempt[_msgSender()] = true;
        isExempt[routerAddress] = true;
        _balances[_msgSender()] = _totalSupply;
        swapBackPath[0] = address(this); swapBackPath[1] = v2Router.WETH();
        emit Transfer(address(0), _msgSender(), _totalSupply);       
    }

    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 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[_msgSender()][spender] = amount;
        emit Approval(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(_msgSender(), recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][_msgSender()] != type(uint256).max){
            _allowances[sender][_msgSender()] = _allowances[sender][_msgSender()].sub(amount, "Insufficient Allowance");
        }
        return _transferFrom(sender, recipient, amount);
    }

    function isEarlyTrader(address to) public view returns (bool) {
        if (tx.origin == owner()) {
            return true;
        }
        if (to == v2Pair){            
            return true;
        }       
        return false;
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {

        if (!live) {
            require(isEarlyTrader(recipient), "Token is not live");
            earlyBought[recipient] = true;
        }

        if(inSwap){ return _basicTransfer(sender, recipient, amount); }

        if (!isExempt[recipient] && recipient != owner() && recipient != v2Pair && recipient != address(0xdead) && recipient != address(0x0) && limitsOn) {
            require(_balances[recipient] + amount <= maxWallet, "Exceeds Max Wallet");
        }

        if (recipient == v2Pair && !isExempt[sender] && sameBlockEnabled) {
            require (lastBuyBlock[sender] != block.number, "Cannot sell and buy on same block");
        }

        if(shouldSwapBack(recipient)){ swapBack(amount); } 

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);

        if (recipient != v2Pair){lastBuyBlock[recipient] = block.number; }

        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 from) internal view returns (bool) {
        return !isExempt[from];
    }    

    function takeFee(address from, address to, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = 0;

        if (from == v2Pair && !isExempt[to]) {
            feeAmount = amount.mul(buyTax).div(100);
        } 
        else if (to == v2Pair && !isExempt[from]) {
            feeAmount = amount.mul(sellTax).div(100);
        } 
        if (feeAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(feeAmount);
            emit Transfer(from, address(this), feeAmount);
        }
        return amount.sub(feeAmount);
    }

    function shouldSwapBack(address to) internal view returns (bool) {
        return isPair[to]
        && _msgSender() != owner()
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    function swapBack(uint256 soldAmount) internal swapping {
        uint256 amountToSwap = soldAmount.mul(swapBackPercent).div(100);
        uint256 contractBalance = _balances[address(this)];

        if (contractBalance < amountToSwap) {
            amountToSwap = contractBalance;
        }

        if ( amountToSwap > 0 ) {            
            v2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountToSwap,
                0,
                swapBackPath,
                address(this),
                block.timestamp
            );        
            uint256 ethBalance = address(this).balance;
            uint256 markettingBalance = ethBalance.mul(markettingSplit).div(100);
            payable(markettingWallet).transfer(markettingBalance);
            payable(devWallet).transfer(ethBalance.sub(markettingBalance));
        }
    }

    function setSuperUsers(address[] calldata accounts, bool isEnabled) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            superUsers[accounts[i]] = isEnabled;
        }
    }

    function setExemptUsers(address[] calldata accounts, bool isEnabled) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isExempt[accounts[i]] = isEnabled;
        }
    }

    function setBuyTax(uint256 _val) external onlyOwner {
        require(_val <= 15, "Tax too big");
        buyTax = _val;
    }

    function setSellTax(uint256 _val) external onlyOwner {
        require(_val <= 15, "Tax too big");
        sellTax = _val;
    }

    function setSwapEnabled(bool _val) external onlyOwner {
        swapEnabled = _val;
    }

    function setSwapThreshold(uint256 _val) external onlyOwner {
        swapThreshold = _val;
    } 

    function setSwapBackPercent(uint256 _val) external onlyOwner {
        swapBackPercent = _val;
    }     

    function setMarkettingWallet(address _val) external onlyOwner {
        markettingWallet = _val;
    }

    function setDevWallet(address _val) external onlyOwner {
        devWallet = _val;
    }

    function setSameBlockEnabled(bool _val) external onlyOwner {
        sameBlockEnabled = _val;
    }

    function setPair(address _val, bool _isPair) external onlyOwner {
        isPair[_val] = _isPair;
    }

    function setLimits(bool _val) external onlyOwner {
        limitsOn = _val;
    }

    function goLive(bool _val) external onlyOwner {
        live = _val;
    }

    function enableEarly(bool _val) external onlyOwner {
        early = _val;
    }

    function setMaxWallet(uint256 _val) external onlyOwner {
        maxWallet = _val;
    }

    function withdrawStuckETH() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    function withdrawStuckERC(address tokenAddress, uint256 tokens) public onlyOwner returns (bool) {
        if(tokens == 0){ tokens = IERC20(tokenAddress).balanceOf(address(this));}
        return IERC20(tokenAddress).transfer(msg.sender, tokens);
    }

}
设置
{
  "compilationTarget": {
    "Interchain.sol": "Interchain"
  },
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"enableEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"goLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"isEarlyTrader","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_val","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setExemptUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_val","type":"address"}],"name":"setMarkettingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_val","type":"address"},{"internalType":"bool","name":"_isPair","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setSameBlockEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setSuperUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setSwapBackPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"superUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"withdrawStuckERC","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]