ETH Price: $3,359.84 (-1.73%)

Token

JARL LABS (JARL)
 

Overview

Max Total Supply

5,000,000 JARL

Holders

78

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.737987026803275598 JARL

Value
$0.00
0x4231b9cae923ea29fd04ce184040705a9f7a7d36
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Jarl

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 3 : JARL.sol
/***************************************************************************************************** 






             ██  █████  ██████  ██          ██       █████  ██████  ███████ 
             ██ ██   ██ ██   ██ ██          ██      ██   ██ ██   ██ ██      
             ██ ███████ ██████  ██          ██      ███████ ██████  ███████ 
        ██   ██ ██   ██ ██   ██ ██          ██      ██   ██ ██   ██      ██ 
         █████  ██   ██ ██   ██ ███████     ███████ ██   ██ ██████  ███████ 
                                                                      



        v2: token extended anti-bot measures and transfer fees
        v1: plain ERC-20 used for LBP launch

******************************************************************************************************/                                                                                                                                 

pragma solidity ^0.8.16;

import {IUniswapV2Factory, IUniswapV2Pair, IUniswapV2Router02} from "Uniswap.sol";
import {IERC20} from "IERC20.sol";

contract Jarl is IERC20 {

    string public constant symbol = "JARL";
    string public constant name = "JARL LABS";
    uint256 public constant decimals = 18;
    uint256 public constant totalSupply = 5_000_000 * (10 ** decimals);
    
    mapping(address => uint256) balances;
    mapping(address => mapping(address => uint256)) allowed;
    
    address payable owner;

    /* 
    States of the contract:
        AIRDROP:  
            no Uniswap liquidity yet, but deployer can send tokens around

        ANTIBOT: 
            anyone buying in the first few blocks after liquidity added gets rekt

        SLOW:
            only allow buying up to 50k tokens at a time (max 100k) for the first 10 minutes
        
        NORMAL: 
            normal operations
    */
    enum State {AIRDROP, ANTIBOT, SLOW, NORMAL}

    // start in airdrop mode, only transfers allowed
    // until liquidity added
    State public currentState = State.AIRDROP;


    /********************************************************
     * 
     *                      ADDRESSES
     * 
     ********************************************************/
     

    address public constant UNISWAP_V2_ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    /********************************************************
     * 
     *             DATA FOR BOTS & AMMs
     * 
     ********************************************************/

    // if any address tries to snipe the liquidity add or buy+sell in the same block,
    // prevent any further txns from them
    mapping(address => bool) public isBot;
    
    IUniswapV2Router02 public immutable uniswapV2Router;
    IUniswapV2Pair public immutable uniswapV2Pair;

    mapping(address => bool) isAMM;
    

    // honestly using this ritualistically since I'm not sure
    // what the possibilities are for reentrancy during a Uniswap 
    // swap 
    bool inSwap = false;


    /********************************************************
     * 
     *     TRACKING BLOCK NUMBERS & TIMESTEMPS
     * 
     ********************************************************/
    

    // track last block of buys and sells to catch sandwich bots
    mapping(address => uint256) lastBuy;

    mapping(address => uint256) lastSell;

    // set this to true when sending tokens to Uniswap
    bool public liquidityAdded = false;

    // timestamp from liquidity getting added 
    // for the first time
    uint256 public liquidityAddedTimestamp;
    

    /********************************************************
     * 
     *                 PARAMETERS
     * 
     ********************************************************/

    // try to trap sniper bots for first 20s
    uint256 constant public honeypotDurationSeconds = 20;
    
    // limit warmup period to just 5m 
    uint256 constant public warmupDurationSeconds = 60 * 10;
    
    // maximum number of tokens you can buy in the first 10 minutes per txn
    uint256 constant public maxBuyDuringWarmup = 25_000 * (10 ** decimals);

    // balance of any one wallet can't exceed this amount during warmup period
    uint256 constant public maxBalanceDuringWarmup = 100_000 * (10 ** decimals);


    // max amount to let bots trade so they think they can buy 
    // and sell freely in the same transaction (~0.2% of float)
    uint256 constant  botTokenLimit = 10_000 * 10 ** decimals;


    /********************************************************
     * 
     *             FEES & RELATED PARAMS
     * 
     ********************************************************/

    uint256 public buyFeePerThousand = 25;
    uint256 public sellFeePerThousand = 25;

    // address which don't pay fees on transfer
    mapping(address => bool) public excludeFromFees;

    // minimum tokens to accumulate on the contract before swapping
    // them for ETH
    uint256 public minTokensForETHSwap = 2_000 * 10 ** decimals;
    
    address public feeRecipient;

    function mustPayFees(address addr) public view returns (bool) {
        return (
            (addr != owner) && 
            (addr != feeRecipient) && 
            (addr != address(this)) && 
            !excludeFromFees[addr] && 
            !isAMM[addr]);
    }


    /********************************************************
     * 
     *                  SETTERS
     * 
     ********************************************************/
    
    
    function setFeeRecipient(address newRecipient) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call setFeeRecipient");
        feeRecipient = newRecipient;
    }

    function setBuyFee(uint256 _buyFeePerThousand) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call setBuyFee");
        buyFeePerThousand = _buyFeePerThousand;
    }

    function setSellFee(uint256 _sellFeePerThousand) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call setSellFee");
        sellFeePerThousand = _sellFeePerThousand;
    }

    function disableFeesForAddress(address addr) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call disableFeesForAddress");
        excludeFromFees[addr] = true;        
    }

    function enableFeesForAddress(address addr) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call enableFeesForAddress");
        excludeFromFees[addr] = false;        
    }

    function setMinTokensToETHSwap(uint256 numTokens) public {
        require(
            owner == msg.sender || feeRecipient == msg.sender,  
            "Only owner or fee recipient allowed to call setMinTokensToETHSwap");
        minTokensForETHSwap = numTokens;
    }

     /********************************************************
     * 
     *                  CONSTRUCTOR
     * 
     ********************************************************/
    

    constructor() {
        // remember which address deployed the JARL contract
        owner = payable(msg.sender);
        feeRecipient = owner;

        // move all 5M tokens to deployer account so it
        // can be split between LBP, Uniswap, &c
        balances[owner] = totalSupply;
        emit Transfer(address(0), owner, totalSupply);
        
        /* 
        Use the Uniswap V2 router to find the RUG/WETH pair
        and register it as an AMM so we can figure out which txns
        are buys/sells vs. just transfers
        */
        uniswapV2Router = IUniswapV2Router02(UNISWAP_V2_ROUTER_ADDRESS);
        IUniswapV2Factory factory = IUniswapV2Factory(uniswapV2Router.factory());
        uniswapV2Pair = IUniswapV2Pair(
            factory.createPair(address(this), uniswapV2Router.WETH()));

        isAMM[address(uniswapV2Pair)] = true;
        isAMM[address(uniswapV2Router)] = true;
    }
    
    // let this contract receive ETH
    receive() external payable {  }

    /********************************************************
     * 
     *                      EVENTS
     * 
     ********************************************************/

    // emitted for trapped bots 
    event FellInHoney(address indexed bot, uint256 value);

    // use the same event signature as openzeppelin-contracts/contracts/access/Ownable.sol 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    

    /********************************************************
     * 
     *                      STANDARD ERC-20
     * 
     ********************************************************/

    function balanceOf(address _owner) public view returns (uint256) {
        return balances[_owner];
    }

    function allowance(address _owner, address _spender) public view returns (uint256) {
        // pre-approve the uniswap router to save on number of approvals required
        if (_spender == address(uniswapV2Router)) { return balances[_owner]; }
        else {
            return allowed[_owner][_spender];
        }
    }

    function _approve(address _owner, address _spender, uint256 _value) internal {
        allowed[_owner][_spender] = _value;
        emit Approval(_owner, _spender, _value);
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        _approve(msg.sender, _spender, _value);
        return true;
    }
    
    function transfer(address _to, uint256 _value) public returns (bool) {
        _transfer(msg.sender, _to, _value);        
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        if (_from != msg.sender && msg.sender != address(uniswapV2Router)) {
            require(allowed[_from][msg.sender] >= _value, "Insufficient allowance");
            allowed[_from][msg.sender] -= _value;
        }
        _transfer(_from, _to, _value);
        return true;
    }

    function transferOwnership(address payable newOwner) public {
        // change contract owner
        require(msg.sender == owner, "Must be owner");
        address payable prevOwner = owner;
        owner = payable(newOwner);
        emit OwnershipTransferred(prevOwner, newOwner);
    }
    
    function rescueETH() public {
        // withdraw ETH which may be accidentally sent to this contract
        require(msg.sender == owner || msg.sender == feeRecipient, "Must be owner or fee recipient");
        payable(msg.sender).transfer(address(this).balance);
    }

    function rescueTokens() public {
        // move tokens from this contract to the owner
        require(msg.sender == owner || msg.sender == feeRecipient, "Must be owner or fee recipient");
        uint256 trappedTokens = balances[address(this)];
        if (trappedTokens > 0) {
            _transfer(address(this), msg.sender, trappedTokens);   
        }
    }

    function _burn(address from, uint256 numTokens) internal {
        require(balances[from] >= numTokens, "Not enough tokens");
        _transfer(from, address(0), numTokens);
    }

    function burn(uint256 numTokens) public {
        _burn(msg.sender, numTokens);
    }

    function addLiquidity(uint256 numTokens) public payable {
        require(msg.sender == owner || msg.sender == feeRecipient, "Only owner or fee recipient can call addLiquidity");
        require(numTokens > 0, "No tokens for liquidity!");
        require(msg.value > 0, "No ETH for liquidity!");

        _transfer(msg.sender, address(this), numTokens);
        _approve(address(this), address(uniswapV2Router), numTokens);
        uniswapV2Router.addLiquidityETH{value: msg.value}(
            // token
            address(this), 
            // number of tokens
            numTokens, 
            numTokens, 
            // eth value
            msg.value, 
            // LP token recipient
            msg.sender, 
            block.timestamp + 15);

        require(
            IERC20(uniswapV2Router.WETH()).balanceOf(address(uniswapV2Pair)) >= msg.value,  
            "ETH didn't get to the pair contract");
        
        liquidityAdded = true;

        // moving tokens to a Uniswap pool looks like selling in the airdrop period but
        // it's actually the liquidity add event!
        liquidityAddedTimestamp = block.timestamp;
                
        // transition from AIRDROP to catching sniper bots
        currentState = State.ANTIBOT;
    }
    


    /********************************************************
     * 
     *              CORE LOGIC (TRANSFER)
     * 
     ********************************************************/

    function isTradingOpen() public view returns (bool) {
        return (currentState == State.SLOW || currentState == State.NORMAL);
    }
    
    function _whoGetsETH() internal view returns (address) {
        return (feeRecipient != address(0)) ? feeRecipient : owner;
    }

    function tryToConvertFeeTokensToETH() public {
        // if we have accumulated enough tokens on the contract, sell them for ETH
        // anyone can call this but the ETH only goes to the feeRecipient address
        uint256 ethReceived = 0;
        if (isTradingOpen() && (balances[address(this)] >= minTokensForETHSwap)) {
            ethReceived = _swapTokensForEth(balances[address(this)]);
        }
        if (ethReceived > 0) {
            payable(_whoGetsETH()).transfer(address(this).balance);
        }
    }

    function _complex_transfer(address _from, address _to, uint256 _value) internal {
        // transfer logic outside of contrat interactions with Uniswap
        bool selling = isAMM[_to];
        bool buying = isAMM[_from];

        /* manage state transitions first */
        if (currentState == State.AIRDROP) {
            require((_from == owner) || (_from == address(this)), "Only deployer and contract can move tokens now");
        } else if (currentState == State.ANTIBOT) {
            if (secondsSinceLiquidityAdded() > honeypotDurationSeconds) {
                currentState = State.SLOW;
            } else if (selling) {
                require(_value < botTokenLimit, "Can't sell more");
            } else if (buying) {
                // if you're trying to buy  in the first few blocks then you're 
                // going to have a bad time
                bool addedBotInHoneypot = _addBotAndOrigin(_to);
                if (addedBotInHoneypot) { emit FellInHoney(_to, _value); }
            } 
        }
            
        if (currentState == State.SLOW) {
            if (secondsSinceLiquidityAdded() > warmupDurationSeconds) {
                currentState = State.NORMAL;
            } else if (buying) {
                require(_value <= maxBuyDuringWarmup, "Only small buys during warmup period");
            }
        }
        
        // see if we have enough tokens accumulated on the contract to sell some for ETH
        if (isTradingOpen() && selling) { tryToConvertFeeTokensToETH(); }

        // subtract tokens from source address before modifying value through
        // fees or anti-bot tricks
        balances[_from] -= _value;

        // compute buy/sell taxes and subtract them from the total
        uint256 feeValue = 0;
        if (!inSwap && currentState != State.AIRDROP) {
            // compute fees
            if (buying && mustPayFees(_to)) {
                feeValue = _value * buyFeePerThousand / 1000; 
            } else if (selling && mustPayFees(_from)) {
                feeValue = _value * sellFeePerThousand / 1000; 
            }
        }

        if (feeValue > 0) {
            _value -= feeValue;
            balances[address(this)] += feeValue;
            emit Transfer(_from, address(this), feeValue);
        }

        // discourage sandwich bots by burning all their tokens
        uint256 toBurn = 0;

        if (!inSwap && currentState != State.AIRDROP) {
            // try to catch sandwich bots
            if (buying) {
                // check if this is a sandwich bot buying after selling
                // in the same block
                if (lastSell[_to] == block.number) { 
                    bool caughtSandiwchBotBuying = _addBotAndOrigin(_to);
                    if (caughtSandiwchBotBuying) { 
                        // burn 99% of their tokens
                        toBurn = _value * 99 / 100;
                    }
                }
            } else if (selling) {
                // check if this is a sandwich bot selling after
                // buying the same block
                if (lastBuy[_from] == block.number) {
                    bool caughtSandwichBotSelling = _addBotAndOrigin(_from);
                    if (caughtSandwichBotSelling) {
                        toBurn = _value * 99 / 100;
                    }
                }
            }

        }

        if (toBurn > 0) {
            require(toBurn < _value, "Can't burn more than original");
            _value -= toBurn;
            balances[address(0)] += toBurn;
            emit Transfer(_from, address(0), _value);
        }
    
        // finally give the receiver whatever tokens are left over
        balances[_to] += _value;        
        emit Transfer(_from, _to, _value);

        if (currentState == State.SLOW && buying) {
            require(balances[_to] <= maxBalanceDuringWarmup, "Balance too large for warmup period");
        } 
        
        // record block numbers and timestamps of any buy/sell txns
        if (buying) { lastBuy[_to] = block.number; } 
        else if (selling) { lastSell[_from] = block.number; }
    }

    function _simple_transfer(address _from, address _to, uint256 _value) internal {
        balances[_from] -= _value;
        balances[_to] += _value;
        emit Transfer(_from, _to, _value);
    }

    function _transfer(address _from, address _to, uint256 _value) internal {
        require(balances[_from] >= _value, "Insufficient balance");
        require(!isBot[_from] || currentState == State.ANTIBOT, "Sorry bot, can't let you out");
        if (inSwap || 
                _from == address(this) ||
                _to == address(this) ||
                ((currentState == State.AIRDROP) && (_from == owner || _from == feeRecipient))) {
            _simple_transfer(_from, _to, _value);
        } else {
            _complex_transfer(_from, _to, _value);
        }

    }


    /********************************************************
     * 
     *                  TIME VIEWS
     * 
     ********************************************************/


    function secondsSinceLiquidityAdded() public view returns (uint256) {
        if (liquidityAdded) {
            return block.timestamp - liquidityAddedTimestamp;
        } else {
            return 0;
        }
    }

    /********************************************************
     * 
     *              BOT FUNCTIONS
     * 
     ********************************************************/


    function isSpecialAddress(address addr) public view returns (bool) {
        return (addr == address(this) || 
                addr == address(0) || 
                addr == owner || 
                addr == feeRecipient || 
                excludeFromFees[addr] ||
                isAMM[addr]);
    }

    function _addBot(address addr) internal returns (bool) {
        // if we already added it then skip the rest of this logic
        if (isBot[addr]) { return true; }
        // make sure we don't accidentally blacklist the deployer, contract, or AMM pool
        if (isSpecialAddress(addr)) { return false; }
        isBot[addr] = true;
        return true;
    }

    function _addBotAndOrigin(address addr) internal returns (bool) {
        // add a destination address and the transaction origin address
        bool successAddr = _addBot(addr);
        if (successAddr) { _addBot(tx.origin); }
        return successAddr;
    }

    function addBot(address addr) public returns (bool) {
        require(msg.sender == owner, "Only owner can call addBot");
        return _addBot(addr);
    }

    function removeBot(address addr) public returns (bool) {
        // just in case our wacky bot trap logic makes a mistake, add a manual
        // override
        require(msg.sender == owner, "Can only be called by owner");
        isBot[addr] = false;
        return true;
    }

    
    /********************************************************
     * 
     *              AMM FUNCTIONS
     * 
     ********************************************************/


    function addAMM(address addr) public returns (bool) {
        require(msg.sender == owner, "Can only be called by owner");
        isAMM[addr] = true;
        return true;
    }

    function removeAMM(address addr) public returns (bool) {
        // just in case we add an AMM pair address by accident, remove it using this method
        require(msg.sender == owner, "Can only be called by owner");
        isAMM[addr] = false;
        return true;
    }



     /********************************************************
     * 
     *              UNISWAP INTERACTIONS
     * 
     ********************************************************/

    function _swapTokensForEth(uint256 numTokens) internal returns (uint256 ethReceived) {
        uint256 oldETHBalance = address(this).balance;

        // set this flag so when Uniswap calls back into the contract
        // we choose paths through the core logic that don't call 
        // into Uniswap again
        inSwap = true;

        // generate the uniswap pair path of $SUDORUG -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), numTokens);
        
        // make the swap

        // Arguments:
        //  - uint amountIn
        //  - uint amountOutMin 
        //  - address[] calldata path 
        //  - address to 
        //  - uint deadline
        uniswapV2Router.swapExactTokensForETH(
            numTokens,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );

        inSwap = false; 
        
        ethReceived = address(this).balance > oldETHBalance ? (address(this).balance - oldETHBalance) : 0;
    }

 

}

File 2 of 3 : Uniswap.sol
pragma solidity ^0.8.7;

interface IUniswapV2Factory {
        event PairCreated(address indexed token0, address indexed token1, address pair, uint);

        function feeTo() external view returns (address);
        function feeToSetter() external view returns (address);

        function getPair(address tokenA, address tokenB) external view returns (address pair);
        function allPairs(uint) external view returns (address pair);
        function allPairsLength() external view returns (uint);

        function createPair(address tokenA, address tokenB) external returns (address pair);

        function setFeeTo(address) external;
        function setFeeToSetter(address) external;
    } 

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    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 removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    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;
}

File 3 of 3 : IERC20.sol
pragma solidity ^0.8.7;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    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);
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "JARL.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract 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":"bot","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FellInHoney","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":[],"name":"UNISWAP_V2_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","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":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFeePerThousand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentState","outputs":[{"internalType":"enum Jarl.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"disableFeesForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"enableFeesForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludeFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honeypotDurationSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSpecialAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddedTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBalanceDuringWarmup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyDuringWarmup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensForETHSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"mustPayFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAMM","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondsSinceLiquidityAdded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeePerThousand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFeePerThousand","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"setMinTokensToETHSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFeePerThousand","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tryToConvertFeeTokensToETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmupDurationSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526002805460ff60a01b191690556005805460ff199081169091556008805490911690556019600a818155600b919091556200004290601290620003dc565b62000050906107d0620003f1565b600d553480156200006057600080fd5b5060028054336001600160a01b03199182168117909255600e80549091169091179055620000916012600a620003dc565b620000a090624c4b40620003f1565b600280546001600160a01b03908116600090815260208190526040812093909355905416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620000f46012600a620003dc565b6200010390624c4b40620003f1565b60405190815260200160405180910390a3737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b815290516000929163c45a01559160048083019260209291908290030181865afa1580156200016d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000193919062000413565b9050806001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020c919062000413565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200025a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000280919062000413565b6001600160a01b0390811660a08190526000908152600460205260408082208054600160ff199182168117909255608051909416835291208054909216179055506200043e565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200031e578160001904821115620003025762000302620002c7565b808516156200031057918102915b93841c9390800290620002e2565b509250929050565b6000826200033757506001620003d6565b816200034657506000620003d6565b81600181146200035f57600281146200036a576200038a565b6001915050620003d6565b60ff8411156200037e576200037e620002c7565b50506001821b620003d6565b5060208310610133831016604e8410600b8410161715620003af575081810a620003d6565b620003bb8383620002dd565b8060001904821115620003d257620003d2620002c7565b0290505b92915050565b6000620003ea838362000326565b9392505050565b60008160001904831182151516156200040e576200040e620002c7565b500290565b6000602082840312156200042657600080fd5b81516001600160a01b0381168114620003ea57600080fd5b60805160a051612948620004a3600039600081816105090152610fec0152600081816103c301528181610af701528181610e5801528181610e8701528181610f55015281816113f3015281816119c501528181611a7e0152611aba01526129486000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063d60f5e66116100c1578063e74b981b1161007a578063e74b981b146107ab578063eec368ac146107cb578063f2fde38b146107e1578063f54d474414610801578063f80f1ace14610821578063ffecf5161461083657600080fd5b8063d60f5e66146106f6578063d944392314610716578063dd62ed3e14610730578063dd8c2e0f14610750578063e18c0e1c14610765578063e57f14e11461077b57600080fd5b806395d89b411161011357806395d89b4114610633578063a284632314610663578063a3a1018b1461068b578063a9059cbb146106a0578063adce4cbf146106c0578063be022c02146106e057600080fd5b806370a08231146105935780637a7b0abb146105c95780637a7c8902146105de5780637bf6f794146105f35780638b4cee081461061357600080fd5b80632481b065116101e857806347ab24f0116101ac57806347ab24f0146104e257806349bd5a5e146104f75780635152d5751461052b57806351c6590a1461054b57806356a060a21461055e5780635fecd9261461057357600080fd5b80632481b06514610447578063313ce5671461045d5780633bbac5791461047257806342966c68146104a257806346904840146104c257600080fd5b80630cc835a31161023a5780630cc835a31461036f57806314bc2e48146103915780631694505e146103b157806318160ddd146103fd57806320800a001461041257806323b872dd1461042757600080fd5b806306fdde03146102825780630919a64f146102cd578063095ea7b3146102f15780630b13ace2146103215780630c3f6acf1461034157600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102b7604051806040016040528060098152602001684a41524c204c41425360b81b81525081565b6040516102c491906123eb565b60405180910390f35b3480156102d957600080fd5b506102e3600a5481565b6040519081526020016102c4565b3480156102fd57600080fd5b5061031161030c36600461244e565b610856565b60405190151581526020016102c4565b34801561032d57600080fd5b5061031161033c36600461247a565b61086d565b34801561034d57600080fd5b5060025461036290600160a01b900460ff1681565b6040516102c491906124b4565b34801561037b57600080fd5b5061038f61038a3660046124dc565b610905565b005b34801561039d57600080fd5b5061038f6103ac3660046124dc565b61098a565b3480156103bd57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c4565b34801561040957600080fd5b506102e3610a1c565b34801561041e57600080fd5b5061038f610a38565b34801561043357600080fd5b506103116104423660046124f5565b610ad6565b34801561045357600080fd5b506102e361025881565b34801561046957600080fd5b506102e3601281565b34801561047e57600080fd5b5061031161048d36600461247a565b60036020526000908152604090205460ff1681565b3480156104ae57600080fd5b5061038f6104bd3660046124dc565b610bd9565b3480156104ce57600080fd5b50600e546103e5906001600160a01b031681565b3480156104ee57600080fd5b5061038f610be3565b34801561050357600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b34801561053757600080fd5b5061038f61054636600461247a565b610c75565b61038f6105593660046124dc565b610d26565b34801561056a57600080fd5b506103116110e2565b34801561057f57600080fd5b5061031161058e36600461247a565b611131565b34801561059f57600080fd5b506102e36105ae36600461247a565b6001600160a01b031660009081526020819052604090205490565b3480156105d557600080fd5b506102e3611183565b3480156105ea57600080fd5b506102e36111a4565b3480156105ff57600080fd5b5061038f61060e36600461247a565b6111bd565b34801561061f57600080fd5b5061038f61062e3660046124dc565b611263565b34801561063f57600080fd5b506102b7604051806040016040528060048152602001631290549360e21b81525081565b34801561066f57600080fd5b506103e5737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561069757600080fd5b506102e36112e4565b3480156106ac57600080fd5b506103116106bb36600461244e565b6112fc565b3480156106cc57600080fd5b506103116106db36600461247a565b611309565b3480156106ec57600080fd5b506102e3600d5481565b34801561070257600080fd5b5061031161071136600461247a565b61135f565b34801561072257600080fd5b506008546103119060ff1681565b34801561073c57600080fd5b506102e361074b366004612536565b6113ef565b34801561075c57600080fd5b5061038f611475565b34801561077157600080fd5b506102e3600b5481565b34801561078757600080fd5b5061031161079636600461247a565b600c6020526000908152604090205460ff1681565b3480156107b757600080fd5b5061038f6107c636600461247a565b611505565b3480156107d757600080fd5b506102e360095481565b3480156107ed57600080fd5b5061038f6107fc36600461247a565b6115aa565b34801561080d57600080fd5b5061031161081c36600461247a565b611646565b34801561082d57600080fd5b506102e3601481565b34801561084257600080fd5b5061031161085136600461247a565b611698565b60006108633384846116fe565b5060015b92915050565b60006001600160a01b03821630148061088d57506001600160a01b038216155b806108a557506002546001600160a01b038381169116145b806108bd5750600e546001600160a01b038381169116145b806108e057506001600160a01b0382166000908152600c602052604090205460ff165b806108675750506001600160a01b031660009081526004602052604090205460ff1690565b6002546001600160a01b03163314806109285750600e546001600160a01b031633145b6109855760405162461bcd60e51b815260206004820152603560248201526000805160206128d383398151915260448201527477656420746f2063616c6c2073657442757946656560581b60648201526084015b60405180910390fd5b600a55565b6002546001600160a01b03163314806109ad5750600e546001600160a01b031633145b610a175760405162461bcd60e51b815260206004820152604160248201526000805160206128d383398151915260448201527f77656420746f2063616c6c207365744d696e546f6b656e73546f4554485377616064820152600760fc1b608482015260a40161097c565b600d55565b610a286012600a612669565b610a3590624c4b40612675565b81565b6002546001600160a01b0316331480610a5b5750600e546001600160a01b031633145b610aa75760405162461bcd60e51b815260206004820152601e60248201527f4d757374206265206f776e6572206f722066656520726563697069656e740000604482015260640161097c565b60405133904780156108fc02916000818181858888f19350505050158015610ad3573d6000803e3d6000fd5b50565b60006001600160a01b0384163314801590610b1a5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b15610bc4576001600160a01b0384166000908152600160209081526040808320338452909152902054821115610b8b5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161097c565b6001600160a01b038416600090815260016020908152604080832033845290915281208054849290610bbe908490612694565b90915550505b610bcf848484611760565b5060019392505050565b610ad333826118f3565b6000610bed6110e2565b8015610c0a5750600d543060009081526020819052604090205410155b15610c2b5730600090815260208190526040902054610c289061195b565b90505b8015610ad357610c39611b6a565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c71573d6000803e3d6000fd5b5050565b6002546001600160a01b0316331480610c985750600e546001600160a01b031633145b610d025760405162461bcd60e51b815260206004820152604160248201526000805160206128d383398151915260448201527f77656420746f2063616c6c2064697361626c6546656573466f724164647265736064820152607360f81b608482015260a40161097c565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6002546001600160a01b0316331480610d495750600e546001600160a01b031633145b610daf5760405162461bcd60e51b815260206004820152603160248201527f4f6e6c79206f776e6572206f722066656520726563697069656e742063616e2060448201527063616c6c206164644c697175696469747960781b606482015260840161097c565b60008111610dff5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320666f72206c6971756964697479210000000000000000604482015260640161097c565b60003411610e475760405162461bcd60e51b81526020600482015260156024820152744e6f2045544820666f72206c69717569646974792160581b604482015260640161097c565b610e52333083611760565b610e7d307f0000000000000000000000000000000000000000000000000000000000000000836116fe565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f305d719343084808333610ebd42600f6126a7565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015610f2a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610f4f91906126ba565b505050347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd591906126e8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291909116906370a0823190602401602060405180830381865afa15801561103d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110619190612705565b10156110bb5760405162461bcd60e51b815260206004820152602360248201527f455448206469646e27742067657420746f20746865207061697220636f6e74726044820152621858dd60ea1b606482015260840161097c565b506008805460ff19166001179055426009556002805460ff60a01b1916600160a01b179055565b600060028054600160a01b900460ff1660038111156111035761110361249e565b148061112c57506003600254600160a01b900460ff16600381111561112a5761112a61249e565b145b905090565b6002546000906001600160a01b0316331461115e5760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600360205260409020805460ff19169055600190565b60085460009060ff161561119e5760095461112c9042612694565b50600090565b6111b06012600a612669565b610a3590620186a0612675565b6002546001600160a01b03163314806111e05750600e546001600160a01b031633145b611242576040805162461bcd60e51b81526020600482015260248101919091526000805160206128d383398151915260448201527f77656420746f2063616c6c20656e61626c6546656573466f7241646472657373606482015260840161097c565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6002546001600160a01b03163314806112865750600e546001600160a01b031633145b6112df5760405162461bcd60e51b815260206004820152603660248201526000805160206128d383398151915260448201527577656420746f2063616c6c2073657453656c6c46656560501b606482015260840161097c565b600b55565b6112f06012600a612669565b610a35906161a8612675565b6000610863338484611760565b6002546000906001600160a01b031633146113365760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600460205260409020805460ff1916600190811790915590565b6002546000906001600160a01b0383811691161480159061138e5750600e546001600160a01b03838116911614155b80156113a357506001600160a01b0382163014155b80156113c857506001600160a01b0382166000908152600c602052604090205460ff16155b80156108675750506001600160a01b031660009081526004602052604090205460ff161590565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361144957506001600160a01b038216600090815260208190526040902054610867565b506001600160a01b03808316600090815260016020908152604080832093851683529290522054610867565b6002546001600160a01b03163314806114985750600e546001600160a01b031633145b6114e45760405162461bcd60e51b815260206004820152601e60248201527f4d757374206265206f776e6572206f722066656520726563697069656e740000604482015260640161097c565b306000908152602081905260409020548015610ad357610ad3303383611760565b6002546001600160a01b03163314806115285750600e546001600160a01b031633145b6115885760405162461bcd60e51b815260206004820152603b60248201526000805160206128d383398151915260448201527f77656420746f2063616c6c20736574466565526563697069656e740000000000606482015260840161097c565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146115f45760405162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015260640161097c565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002546000906001600160a01b031633146116735760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600460205260409020805460ff19169055600190565b6002546000906001600160a01b031633146116f55760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e65722063616e2063616c6c20616464426f74000000000000604482015260640161097c565b61086782611b9d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152602081905260409020548111156117bf5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161097c565b6001600160a01b03831660009081526003602052604090205460ff16158061180457506001600254600160a01b900460ff1660038111156118025761180261249e565b145b6118505760405162461bcd60e51b815260206004820152601c60248201527f536f72727920626f742c2063616e2774206c657420796f75206f757400000000604482015260640161097c565b60055460ff168061186957506001600160a01b03831630145b8061187c57506001600160a01b03821630145b806118d357506000600254600160a01b900460ff1660038111156118a2576118a261249e565b1480156118d357506002546001600160a01b03848116911614806118d35750600e546001600160a01b038481169116145b156118e8576118e3838383611c05565b505050565b6118e3838383611c94565b6001600160a01b03821660009081526020819052604090205481111561194f5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015260640161097c565b610c7182600083611760565b6005805460ff1916600117905560408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106119a3576119a361276b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4591906126e8565b81600181518110611a5857611a5861276b565b60200260200101906001600160a01b031690816001600160a01b031681525050611aa3307f0000000000000000000000000000000000000000000000000000000000000000866116fe565b6040516318cbafe560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe590611af8908790600090869030904290600401612781565b6000604051808303816000875af1158015611b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b3f91908101906127f2565b506005805460ff19169055478210611b58576000611b62565b611b628247612694565b949350505050565b600e546000906001600160a01b0316611b8d57506002546001600160a01b031690565b50600e546001600160a01b031690565b6001600160a01b03811660009081526003602052604081205460ff1615611bc657506001919050565b611bcf8261086d565b15611bdc57506000919050565b506001600160a01b03166000908152600360205260409020805460ff1916600190811790915590565b6001600160a01b03831660009081526020819052604081208054839290611c2d908490612694565b90915550506001600160a01b03821660009081526020819052604081208054839290611c5a9084906126a7565b92505081905550816001600160a01b0316836001600160a01b03166000805160206128f38339815191528360405161175391815260200190565b6001600160a01b0380831660009081526004602052604080822054928616825281205460ff928316921690600254600160a01b900460ff166003811115611cdd57611cdd61249e565b03611d6e576002546001600160a01b0386811691161480611d0657506001600160a01b03851630145b611d695760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206465706c6f79657220616e6420636f6e74726163742063616e206d60448201526d6f766520746f6b656e73206e6f7760901b606482015260840161097c565b611e78565b6001600254600160a01b900460ff166003811115611d8e57611d8e61249e565b03611e78576014611d9d611183565b1115611dbb576002805460ff60a01b1916600160a11b179055611e78565b8115611e1957611dcd6012600a612669565b611dd990612710612675565b8310611d695760405162461bcd60e51b815260206004820152600f60248201526e43616e27742073656c6c206d6f726560881b604482015260640161097c565b8015611e78576000611e2a856123c7565b90508015611e7657846001600160a01b03167f83efabacf9f7cf6e679b0fd9de0113ad1e05f72b1955dedadf0e01422a52234a85604051611e6d91815260200190565b60405180910390a25b505b60028054600160a01b900460ff166003811115611e9757611e9761249e565b03611f3e57610258611ea7611183565b1115611ec5576002805460ff60a01b1916600360a01b179055611f3e565b8015611f3e57611ed76012600a612669565b611ee3906161a8612675565b831115611f3e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920736d616c6c206275797320647572696e67207761726d75702070656044820152631c9a5bd960e21b606482015260840161097c565b611f466110e2565b8015611f4f5750815b15611f5c57611f5c610be3565b6001600160a01b03851660009081526020819052604081208054859290611f84908490612694565b909155505060055460009060ff16158015611fbd57506000600254600160a01b900460ff166003811115611fba57611fba61249e565b14155b1561202e57818015611fd35750611fd38561135f565b15611ffa576103e8600a5485611fe99190612675565b611ff391906128b0565b905061202e565b82801561200b575061200b8661135f565b1561202e576103e8600b54856120219190612675565b61202b91906128b0565b90505b80156120965761203e8185612694565b306000908152602081905260408120805492965083929091906120629084906126a7565b909155505060405181815230906001600160a01b038816906000805160206128f38339815191529060200160405180910390a35b60055460009060ff161580156120ca57506000600254600160a01b900460ff1660038111156120c7576120c761249e565b14155b1561217e578215612129576001600160a01b038616600090815260076020526040902054439003612124576000612100876123c7565b90508015612122576064612115876063612675565b61211f91906128b0565b91505b505b61217e565b831561217e576001600160a01b03871660009081526006602052604090205443900361217e57600061215a886123c7565b9050801561217c57606461216f876063612675565b61217991906128b0565b91505b505b8015612252578481106121d35760405162461bcd60e51b815260206004820152601d60248201527f43616e2774206275726e206d6f7265207468616e206f726967696e616c000000604482015260640161097c565b6121dd8186612694565b600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054929750839290919061221d9084906126a7565b90915550506040518581526000906001600160a01b038916906000805160206128f38339815191529060200160405180910390a35b6001600160a01b0386166000908152602081905260408120805487929061227a9084906126a7565b92505081905550856001600160a01b0316876001600160a01b03166000805160206128f3833981519152876040516122b491815260200190565b60405180910390a360028054600160a01b900460ff1660038111156122db576122db61249e565b1480156122e55750825b15612376576122f66012600a612669565b61230390620186a0612675565b6001600160a01b03871660009081526020819052604090205411156123765760405162461bcd60e51b815260206004820152602360248201527f42616c616e636520746f6f206c6172676520666f72207761726d7570207065726044820152621a5bd960ea1b606482015260840161097c565b821561239c576001600160a01b03861660009081526006602052604090204390556123be565b83156123be576001600160a01b03871660009081526007602052604090204390555b50505050505050565b6000806123d383611b9d565b90508015610867576123e432611b9d565b5092915050565b600060208083528351808285015260005b81811015612418578581018301518582016040015282016123fc565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ad357600080fd5b6000806040838503121561246157600080fd5b823561246c81612439565b946020939093013593505050565b60006020828403121561248c57600080fd5b813561249781612439565b9392505050565b634e487b7160e01b600052602160045260246000fd5b60208101600483106124d657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156124ee57600080fd5b5035919050565b60008060006060848603121561250a57600080fd5b833561251581612439565b9250602084013561252581612439565b929592945050506040919091013590565b6000806040838503121561254957600080fd5b823561255481612439565b9150602083013561256481612439565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156125c05781600019048211156125a6576125a661256f565b808516156125b357918102915b93841c939080029061258a565b509250929050565b6000826125d757506001610867565b816125e457506000610867565b81600181146125fa576002811461260457612620565b6001915050610867565b60ff8411156126155761261561256f565b50506001821b610867565b5060208310610133831016604e8410600b8410161715612643575081810a610867565b61264d8383612585565b80600019048211156126615761266161256f565b029392505050565b600061249783836125c8565b600081600019048311821515161561268f5761268f61256f565b500290565b818103818111156108675761086761256f565b808201808211156108675761086761256f565b6000806000606084860312156126cf57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156126fa57600080fd5b815161249781612439565b60006020828403121561271757600080fd5b5051919050565b6020808252601b908201527f43616e206f6e6c792062652063616c6c6564206279206f776e65720000000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156127d15784516001600160a01b0316835293830193918301916001016127ac565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561280557600080fd5b825167ffffffffffffffff8082111561281d57600080fd5b818501915085601f83011261283157600080fd5b81518181111561284357612843612755565b8060051b604051601f19603f8301168101818110858211171561286857612868612755565b60405291825284820192508381018501918883111561288657600080fd5b938501935b828510156128a45784518452938501939285019261288b565b98975050505050505050565b6000826128cd57634e487b7160e01b600052601260045260246000fd5b50049056fe4f6e6c79206f776e6572206f722066656520726563697069656e7420616c6c6fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220280bb6b499640f16b81805a9e02bcded5e2dead6d3848369d1f0ca495eec13c564736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063d60f5e66116100c1578063e74b981b1161007a578063e74b981b146107ab578063eec368ac146107cb578063f2fde38b146107e1578063f54d474414610801578063f80f1ace14610821578063ffecf5161461083657600080fd5b8063d60f5e66146106f6578063d944392314610716578063dd62ed3e14610730578063dd8c2e0f14610750578063e18c0e1c14610765578063e57f14e11461077b57600080fd5b806395d89b411161011357806395d89b4114610633578063a284632314610663578063a3a1018b1461068b578063a9059cbb146106a0578063adce4cbf146106c0578063be022c02146106e057600080fd5b806370a08231146105935780637a7b0abb146105c95780637a7c8902146105de5780637bf6f794146105f35780638b4cee081461061357600080fd5b80632481b065116101e857806347ab24f0116101ac57806347ab24f0146104e257806349bd5a5e146104f75780635152d5751461052b57806351c6590a1461054b57806356a060a21461055e5780635fecd9261461057357600080fd5b80632481b06514610447578063313ce5671461045d5780633bbac5791461047257806342966c68146104a257806346904840146104c257600080fd5b80630cc835a31161023a5780630cc835a31461036f57806314bc2e48146103915780631694505e146103b157806318160ddd146103fd57806320800a001461041257806323b872dd1461042757600080fd5b806306fdde03146102825780630919a64f146102cd578063095ea7b3146102f15780630b13ace2146103215780630c3f6acf1461034157600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102b7604051806040016040528060098152602001684a41524c204c41425360b81b81525081565b6040516102c491906123eb565b60405180910390f35b3480156102d957600080fd5b506102e3600a5481565b6040519081526020016102c4565b3480156102fd57600080fd5b5061031161030c36600461244e565b610856565b60405190151581526020016102c4565b34801561032d57600080fd5b5061031161033c36600461247a565b61086d565b34801561034d57600080fd5b5060025461036290600160a01b900460ff1681565b6040516102c491906124b4565b34801561037b57600080fd5b5061038f61038a3660046124dc565b610905565b005b34801561039d57600080fd5b5061038f6103ac3660046124dc565b61098a565b3480156103bd57600080fd5b506103e57f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102c4565b34801561040957600080fd5b506102e3610a1c565b34801561041e57600080fd5b5061038f610a38565b34801561043357600080fd5b506103116104423660046124f5565b610ad6565b34801561045357600080fd5b506102e361025881565b34801561046957600080fd5b506102e3601281565b34801561047e57600080fd5b5061031161048d36600461247a565b60036020526000908152604090205460ff1681565b3480156104ae57600080fd5b5061038f6104bd3660046124dc565b610bd9565b3480156104ce57600080fd5b50600e546103e5906001600160a01b031681565b3480156104ee57600080fd5b5061038f610be3565b34801561050357600080fd5b506103e57f000000000000000000000000ea1c0f67deead492ff0561e69b298d43f5af153e81565b34801561053757600080fd5b5061038f61054636600461247a565b610c75565b61038f6105593660046124dc565b610d26565b34801561056a57600080fd5b506103116110e2565b34801561057f57600080fd5b5061031161058e36600461247a565b611131565b34801561059f57600080fd5b506102e36105ae36600461247a565b6001600160a01b031660009081526020819052604090205490565b3480156105d557600080fd5b506102e3611183565b3480156105ea57600080fd5b506102e36111a4565b3480156105ff57600080fd5b5061038f61060e36600461247a565b6111bd565b34801561061f57600080fd5b5061038f61062e3660046124dc565b611263565b34801561063f57600080fd5b506102b7604051806040016040528060048152602001631290549360e21b81525081565b34801561066f57600080fd5b506103e5737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561069757600080fd5b506102e36112e4565b3480156106ac57600080fd5b506103116106bb36600461244e565b6112fc565b3480156106cc57600080fd5b506103116106db36600461247a565b611309565b3480156106ec57600080fd5b506102e3600d5481565b34801561070257600080fd5b5061031161071136600461247a565b61135f565b34801561072257600080fd5b506008546103119060ff1681565b34801561073c57600080fd5b506102e361074b366004612536565b6113ef565b34801561075c57600080fd5b5061038f611475565b34801561077157600080fd5b506102e3600b5481565b34801561078757600080fd5b5061031161079636600461247a565b600c6020526000908152604090205460ff1681565b3480156107b757600080fd5b5061038f6107c636600461247a565b611505565b3480156107d757600080fd5b506102e360095481565b3480156107ed57600080fd5b5061038f6107fc36600461247a565b6115aa565b34801561080d57600080fd5b5061031161081c36600461247a565b611646565b34801561082d57600080fd5b506102e3601481565b34801561084257600080fd5b5061031161085136600461247a565b611698565b60006108633384846116fe565b5060015b92915050565b60006001600160a01b03821630148061088d57506001600160a01b038216155b806108a557506002546001600160a01b038381169116145b806108bd5750600e546001600160a01b038381169116145b806108e057506001600160a01b0382166000908152600c602052604090205460ff165b806108675750506001600160a01b031660009081526004602052604090205460ff1690565b6002546001600160a01b03163314806109285750600e546001600160a01b031633145b6109855760405162461bcd60e51b815260206004820152603560248201526000805160206128d383398151915260448201527477656420746f2063616c6c2073657442757946656560581b60648201526084015b60405180910390fd5b600a55565b6002546001600160a01b03163314806109ad5750600e546001600160a01b031633145b610a175760405162461bcd60e51b815260206004820152604160248201526000805160206128d383398151915260448201527f77656420746f2063616c6c207365744d696e546f6b656e73546f4554485377616064820152600760fc1b608482015260a40161097c565b600d55565b610a286012600a612669565b610a3590624c4b40612675565b81565b6002546001600160a01b0316331480610a5b5750600e546001600160a01b031633145b610aa75760405162461bcd60e51b815260206004820152601e60248201527f4d757374206265206f776e6572206f722066656520726563697069656e740000604482015260640161097c565b60405133904780156108fc02916000818181858888f19350505050158015610ad3573d6000803e3d6000fd5b50565b60006001600160a01b0384163314801590610b1a5750336001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1614155b15610bc4576001600160a01b0384166000908152600160209081526040808320338452909152902054821115610b8b5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015260640161097c565b6001600160a01b038416600090815260016020908152604080832033845290915281208054849290610bbe908490612694565b90915550505b610bcf848484611760565b5060019392505050565b610ad333826118f3565b6000610bed6110e2565b8015610c0a5750600d543060009081526020819052604090205410155b15610c2b5730600090815260208190526040902054610c289061195b565b90505b8015610ad357610c39611b6a565b6001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610c71573d6000803e3d6000fd5b5050565b6002546001600160a01b0316331480610c985750600e546001600160a01b031633145b610d025760405162461bcd60e51b815260206004820152604160248201526000805160206128d383398151915260448201527f77656420746f2063616c6c2064697361626c6546656573466f724164647265736064820152607360f81b608482015260a40161097c565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6002546001600160a01b0316331480610d495750600e546001600160a01b031633145b610daf5760405162461bcd60e51b815260206004820152603160248201527f4f6e6c79206f776e6572206f722066656520726563697069656e742063616e2060448201527063616c6c206164644c697175696469747960781b606482015260840161097c565b60008111610dff5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320666f72206c6971756964697479210000000000000000604482015260640161097c565b60003411610e475760405162461bcd60e51b81526020600482015260156024820152744e6f2045544820666f72206c69717569646974792160581b604482015260640161097c565b610e52333083611760565b610e7d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d836116fe565b6001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663f305d719343084808333610ebd42600f6126a7565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015610f2a573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610f4f91906126ba565b505050347f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd591906126e8565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000ea1c0f67deead492ff0561e69b298d43f5af153e8116600483015291909116906370a0823190602401602060405180830381865afa15801561103d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110619190612705565b10156110bb5760405162461bcd60e51b815260206004820152602360248201527f455448206469646e27742067657420746f20746865207061697220636f6e74726044820152621858dd60ea1b606482015260840161097c565b506008805460ff19166001179055426009556002805460ff60a01b1916600160a01b179055565b600060028054600160a01b900460ff1660038111156111035761110361249e565b148061112c57506003600254600160a01b900460ff16600381111561112a5761112a61249e565b145b905090565b6002546000906001600160a01b0316331461115e5760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600360205260409020805460ff19169055600190565b60085460009060ff161561119e5760095461112c9042612694565b50600090565b6111b06012600a612669565b610a3590620186a0612675565b6002546001600160a01b03163314806111e05750600e546001600160a01b031633145b611242576040805162461bcd60e51b81526020600482015260248101919091526000805160206128d383398151915260448201527f77656420746f2063616c6c20656e61626c6546656573466f7241646472657373606482015260840161097c565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6002546001600160a01b03163314806112865750600e546001600160a01b031633145b6112df5760405162461bcd60e51b815260206004820152603660248201526000805160206128d383398151915260448201527577656420746f2063616c6c2073657453656c6c46656560501b606482015260840161097c565b600b55565b6112f06012600a612669565b610a35906161a8612675565b6000610863338484611760565b6002546000906001600160a01b031633146113365760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600460205260409020805460ff1916600190811790915590565b6002546000906001600160a01b0383811691161480159061138e5750600e546001600160a01b03838116911614155b80156113a357506001600160a01b0382163014155b80156113c857506001600160a01b0382166000908152600c602052604090205460ff16155b80156108675750506001600160a01b031660009081526004602052604090205460ff161590565b60007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b03160361144957506001600160a01b038216600090815260208190526040902054610867565b506001600160a01b03808316600090815260016020908152604080832093851683529290522054610867565b6002546001600160a01b03163314806114985750600e546001600160a01b031633145b6114e45760405162461bcd60e51b815260206004820152601e60248201527f4d757374206265206f776e6572206f722066656520726563697069656e740000604482015260640161097c565b306000908152602081905260409020548015610ad357610ad3303383611760565b6002546001600160a01b03163314806115285750600e546001600160a01b031633145b6115885760405162461bcd60e51b815260206004820152603b60248201526000805160206128d383398151915260448201527f77656420746f2063616c6c20736574466565526563697069656e740000000000606482015260840161097c565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146115f45760405162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015260640161097c565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002546000906001600160a01b031633146116735760405162461bcd60e51b815260040161097c9061271e565b506001600160a01b03166000908152600460205260409020805460ff19169055600190565b6002546000906001600160a01b031633146116f55760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e65722063616e2063616c6c20616464426f74000000000000604482015260640161097c565b61086782611b9d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152602081905260409020548111156117bf5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161097c565b6001600160a01b03831660009081526003602052604090205460ff16158061180457506001600254600160a01b900460ff1660038111156118025761180261249e565b145b6118505760405162461bcd60e51b815260206004820152601c60248201527f536f72727920626f742c2063616e2774206c657420796f75206f757400000000604482015260640161097c565b60055460ff168061186957506001600160a01b03831630145b8061187c57506001600160a01b03821630145b806118d357506000600254600160a01b900460ff1660038111156118a2576118a261249e565b1480156118d357506002546001600160a01b03848116911614806118d35750600e546001600160a01b038481169116145b156118e8576118e3838383611c05565b505050565b6118e3838383611c94565b6001600160a01b03821660009081526020819052604090205481111561194f5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015260640161097c565b610c7182600083611760565b6005805460ff1916600117905560408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106119a3576119a361276b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4591906126e8565b81600181518110611a5857611a5861276b565b60200260200101906001600160a01b031690816001600160a01b031681525050611aa3307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d866116fe565b6040516318cbafe560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906318cbafe590611af8908790600090869030904290600401612781565b6000604051808303816000875af1158015611b17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b3f91908101906127f2565b506005805460ff19169055478210611b58576000611b62565b611b628247612694565b949350505050565b600e546000906001600160a01b0316611b8d57506002546001600160a01b031690565b50600e546001600160a01b031690565b6001600160a01b03811660009081526003602052604081205460ff1615611bc657506001919050565b611bcf8261086d565b15611bdc57506000919050565b506001600160a01b03166000908152600360205260409020805460ff1916600190811790915590565b6001600160a01b03831660009081526020819052604081208054839290611c2d908490612694565b90915550506001600160a01b03821660009081526020819052604081208054839290611c5a9084906126a7565b92505081905550816001600160a01b0316836001600160a01b03166000805160206128f38339815191528360405161175391815260200190565b6001600160a01b0380831660009081526004602052604080822054928616825281205460ff928316921690600254600160a01b900460ff166003811115611cdd57611cdd61249e565b03611d6e576002546001600160a01b0386811691161480611d0657506001600160a01b03851630145b611d695760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206465706c6f79657220616e6420636f6e74726163742063616e206d60448201526d6f766520746f6b656e73206e6f7760901b606482015260840161097c565b611e78565b6001600254600160a01b900460ff166003811115611d8e57611d8e61249e565b03611e78576014611d9d611183565b1115611dbb576002805460ff60a01b1916600160a11b179055611e78565b8115611e1957611dcd6012600a612669565b611dd990612710612675565b8310611d695760405162461bcd60e51b815260206004820152600f60248201526e43616e27742073656c6c206d6f726560881b604482015260640161097c565b8015611e78576000611e2a856123c7565b90508015611e7657846001600160a01b03167f83efabacf9f7cf6e679b0fd9de0113ad1e05f72b1955dedadf0e01422a52234a85604051611e6d91815260200190565b60405180910390a25b505b60028054600160a01b900460ff166003811115611e9757611e9761249e565b03611f3e57610258611ea7611183565b1115611ec5576002805460ff60a01b1916600360a01b179055611f3e565b8015611f3e57611ed76012600a612669565b611ee3906161a8612675565b831115611f3e5760405162461bcd60e51b8152602060048201526024808201527f4f6e6c7920736d616c6c206275797320647572696e67207761726d75702070656044820152631c9a5bd960e21b606482015260840161097c565b611f466110e2565b8015611f4f5750815b15611f5c57611f5c610be3565b6001600160a01b03851660009081526020819052604081208054859290611f84908490612694565b909155505060055460009060ff16158015611fbd57506000600254600160a01b900460ff166003811115611fba57611fba61249e565b14155b1561202e57818015611fd35750611fd38561135f565b15611ffa576103e8600a5485611fe99190612675565b611ff391906128b0565b905061202e565b82801561200b575061200b8661135f565b1561202e576103e8600b54856120219190612675565b61202b91906128b0565b90505b80156120965761203e8185612694565b306000908152602081905260408120805492965083929091906120629084906126a7565b909155505060405181815230906001600160a01b038816906000805160206128f38339815191529060200160405180910390a35b60055460009060ff161580156120ca57506000600254600160a01b900460ff1660038111156120c7576120c761249e565b14155b1561217e578215612129576001600160a01b038616600090815260076020526040902054439003612124576000612100876123c7565b90508015612122576064612115876063612675565b61211f91906128b0565b91505b505b61217e565b831561217e576001600160a01b03871660009081526006602052604090205443900361217e57600061215a886123c7565b9050801561217c57606461216f876063612675565b61217991906128b0565b91505b505b8015612252578481106121d35760405162461bcd60e51b815260206004820152601d60248201527f43616e2774206275726e206d6f7265207468616e206f726967696e616c000000604482015260640161097c565b6121dd8186612694565b600080805260208190527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054929750839290919061221d9084906126a7565b90915550506040518581526000906001600160a01b038916906000805160206128f38339815191529060200160405180910390a35b6001600160a01b0386166000908152602081905260408120805487929061227a9084906126a7565b92505081905550856001600160a01b0316876001600160a01b03166000805160206128f3833981519152876040516122b491815260200190565b60405180910390a360028054600160a01b900460ff1660038111156122db576122db61249e565b1480156122e55750825b15612376576122f66012600a612669565b61230390620186a0612675565b6001600160a01b03871660009081526020819052604090205411156123765760405162461bcd60e51b815260206004820152602360248201527f42616c616e636520746f6f206c6172676520666f72207761726d7570207065726044820152621a5bd960ea1b606482015260840161097c565b821561239c576001600160a01b03861660009081526006602052604090204390556123be565b83156123be576001600160a01b03871660009081526007602052604090204390555b50505050505050565b6000806123d383611b9d565b90508015610867576123e432611b9d565b5092915050565b600060208083528351808285015260005b81811015612418578581018301518582016040015282016123fc565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610ad357600080fd5b6000806040838503121561246157600080fd5b823561246c81612439565b946020939093013593505050565b60006020828403121561248c57600080fd5b813561249781612439565b9392505050565b634e487b7160e01b600052602160045260246000fd5b60208101600483106124d657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156124ee57600080fd5b5035919050565b60008060006060848603121561250a57600080fd5b833561251581612439565b9250602084013561252581612439565b929592945050506040919091013590565b6000806040838503121561254957600080fd5b823561255481612439565b9150602083013561256481612439565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156125c05781600019048211156125a6576125a661256f565b808516156125b357918102915b93841c939080029061258a565b509250929050565b6000826125d757506001610867565b816125e457506000610867565b81600181146125fa576002811461260457612620565b6001915050610867565b60ff8411156126155761261561256f565b50506001821b610867565b5060208310610133831016604e8410600b8410161715612643575081810a610867565b61264d8383612585565b80600019048211156126615761266161256f565b029392505050565b600061249783836125c8565b600081600019048311821515161561268f5761268f61256f565b500290565b818103818111156108675761086761256f565b808201808211156108675761086761256f565b6000806000606084860312156126cf57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156126fa57600080fd5b815161249781612439565b60006020828403121561271757600080fd5b5051919050565b6020808252601b908201527f43616e206f6e6c792062652063616c6c6564206279206f776e65720000000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156127d15784516001600160a01b0316835293830193918301916001016127ac565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561280557600080fd5b825167ffffffffffffffff8082111561281d57600080fd5b818501915085601f83011261283157600080fd5b81518181111561284357612843612755565b8060051b604051601f19603f8301168101818110858211171561286857612868612755565b60405291825284820192508381018501918883111561288657600080fd5b938501935b828510156128a45784518452938501939285019261288b565b98975050505050505050565b6000826128cd57634e487b7160e01b600052601260045260246000fd5b50049056fe4f6e6c79206f776e6572206f722066656520726563697069656e7420616c6c6fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220280bb6b499640f16b81805a9e02bcded5e2dead6d3848369d1f0ca495eec13c564736f6c63430008100033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.