ETH Price: $2,653.19 (+1.56%)

Contract

0x7f13B1FF92F9A01EcF33da2a0b8225c8b4FF4DD5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

Transaction Hash
Method
Block
From
To
Create Pair With...146084382022-04-18 9:38:34914 days ago1650274714IN
0x7f13B1FF...8b4FF4DD5
0.792307 ETH0.007677423.2473908
0x60806040145068422022-04-02 12:55:55930 days ago1648904155IN
 Create: FalconSwapV3factory
0 ETH0.1360607250.99284074

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
146084382022-04-18 9:38:34914 days ago1650274714
0x7f13B1FF...8b4FF4DD5
0.792307 ETH
146084382022-04-18 9:38:34914 days ago1650274714
0x7f13B1FF...8b4FF4DD5
 Contract Creation0 ETH
145068422022-04-02 12:55:55930 days ago1648904155
0x7f13B1FF...8b4FF4DD5
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FalconSwapV3factory

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-06
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    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);
}

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function sub(uint x, uint y, string memory errorMessage) internal pure returns (uint z) {
        require((z = x - y) <= x, errorMessage);
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }

    function div(uint256 a, uint256 b) internal pure returns (uint z) {
        require(b > 0);
        z = a / b;
    }
}

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

library FalconSwapV3Library {
    using SafeMath for uint;

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'FalconSwapV3Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'FalconSwapV3Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'FalconSwapV3Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'FalconSwapV3Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }
}


library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }
    
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }
    
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}



contract ERC20 is IERC20 {
    using SafeMath for uint;

    string public constant name = 'FalconSwap V3';
    string public constant symbol = 'FSW-V3';
    uint8 public constant decimals = 18;
    uint  public totalSupply;
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;

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

    constructor() {}

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint).max) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }
}

contract FalconSwapV3Pool is ERC20 {
    using SafeMath for uint;
    using SafeERC20 for IERC20;

    address public token;
    address public factory;
    bool isSetup;

    event Sync(uint reserve0, uint reserve1);
    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
    );

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'txn expired');
        _;
    }

    constructor() { }

    // for uniswap compatibility
    function token0() external pure returns (address) { return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; }
    function token1() external view returns (address) { return token; }
    function reserve0() external view returns (uint) { return address(this).balance; }
    function reserve1() external view returns (uint) { return IERC20(token).balanceOf(address(this)); }
    function getReserves() external view returns(uint, uint, uint) {
        return (
            address(this).balance,
            IERC20(token).balanceOf(address(this)),
            block.timestamp
        );
    }
    // end

    function setup(address _token) external {
        require(!isSetup, "Already Setup");
        isSetup = true;
        token = _token;
        factory = msg.sender;
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'ETH transfer failed');
    }

    // Swap Functions ->
    function swapExactETHForTokens(uint _tokenAmountMin, address to, uint deadline) payable external ensure(deadline) returns (uint _tokenAmount) {
        IERC20 _token_inter = IERC20(token);
        uint reserveEth = (address(this).balance).sub(msg.value);
        uint reserveToken = _token_inter.balanceOf(address(this));
        
        _tokenAmount = FalconSwapV3Library.getAmountOut(msg.value, reserveEth, reserveToken);
        require(_tokenAmountMin <= _tokenAmount, "slippage issue");
        _token_inter.safeTransfer(to, _tokenAmount);

        emit Swap(msg.sender, msg.value, 0, 0, _tokenAmount, to);
        emit Sync(reserveEth.add(msg.value), reserveToken.sub(_tokenAmount));
    }
    
    function swapETHForExactTokens(uint _tokenAmount, address to, uint deadline) payable external ensure(deadline) returns (uint _ethAmount) {
        IERC20 _token_inter = IERC20(token);
        uint reserveEth = (address(this).balance).sub(msg.value);
        uint reserveToken = _token_inter.balanceOf(address(this));
        
        _ethAmount = FalconSwapV3Library.getAmountIn(_tokenAmount, reserveEth, reserveToken);
        require(_ethAmount <= msg.value, "slippage issue");
        _token_inter.safeTransfer(to, _tokenAmount);

        if(msg.value > _ethAmount){
            safeTransferETH(msg.sender, msg.value.sub(_ethAmount));
        }

        emit Swap(msg.sender, _ethAmount, 0, 0, _tokenAmount, to);
        emit Sync(reserveEth.add(_ethAmount), reserveToken.sub(_tokenAmount));
    }

    function swapExactTokensForETH(uint _tokenAmount, uint _ethAmountMin, address to, uint deadline) external ensure(deadline) returns (uint _ethAmount) {
        IERC20 _token_inter = IERC20(token);
        uint reserveEth = address(this).balance;
        uint reserveToken = _token_inter.balanceOf(address(this));
        
        _ethAmount = FalconSwapV3Library.getAmountOut(_tokenAmount, reserveToken, reserveEth);
        require(_ethAmountMin <= _ethAmount, "slippage issue");
        _token_inter.safeTransferFrom(msg.sender, address(this), _tokenAmount);
        safeTransferETH(to, _ethAmount);

        emit Swap(msg.sender, 0, _tokenAmount, _ethAmount, 0, to);
        emit Sync(reserveEth.sub(_ethAmount), reserveToken.add(_tokenAmount));
    }

    function swapTokensForExactETH(uint _ethAmount, uint _tokenAmountMax, address to, uint deadline) external ensure(deadline) returns (uint _tokenAmount) {
        IERC20 _token_inter = IERC20(token);
        uint reserveEth = address(this).balance;
        uint reserveToken = _token_inter.balanceOf(address(this));
        
        _tokenAmount = FalconSwapV3Library.getAmountIn(_ethAmount, reserveToken, reserveEth);
        require(_tokenAmount <= _tokenAmountMax, "slippage issue");
        _token_inter.safeTransferFrom(msg.sender, address(this), _tokenAmount);
        safeTransferETH(to, _ethAmount);

        emit Swap(msg.sender, 0, _tokenAmount, _ethAmount, 0, to);
        emit Sync(reserveEth.sub(_ethAmount), reserveToken.add(_tokenAmount));
    }

    // add Liquidity ->
    function _addLiquidityETHinternal(uint _tokenAmountMin, uint _tokenAmountMax, address from, address to) internal returns (uint liquidity) {
        require(msg.value > 0 && _tokenAmountMin > 0, 'invalid amounts');
        uint _ethAmount = msg.value;
        IERC20 _token_inter = IERC20(token);

        uint reserveEth = (address(this).balance).sub(msg.value);
        uint reserveToken = _token_inter.balanceOf(address(this));
        uint _totalSupply = totalSupply;

        uint _tokenAmount;
        if(_totalSupply > 0){
            _tokenAmount = ( msg.value.mul( reserveToken ) ).div(reserveEth);
            require(_tokenAmount >= _tokenAmountMin, "wrong token ratio");
            require(_tokenAmount <= _tokenAmountMax, "wrong token ratio");
        } 
        else {
            _tokenAmount = _tokenAmountMin;
        }

        _token_inter.safeTransferFrom(from, address(this), _tokenAmount);

        require(reserveToken == (_token_inter.balanceOf(address(this))).sub(_tokenAmount), 'deflationary tokens not supported');

        if (_totalSupply == 0) {
            liquidity = Math.sqrt(_ethAmount.mul(_tokenAmount)).sub(10**3);
           _mint(address(0), 10**3);
        } else {
            liquidity = Math.min(_ethAmount.mul(_totalSupply) / reserveEth, _tokenAmount.mul(_totalSupply) / reserveToken);
        }
        require(liquidity > 0, 'liquidity mint issue');

        uint _fee = FalconSwapV3factory(factory).fee();
        if(_fee > 0){
            uint _feeAmount = ( liquidity.mul(_fee) ).div(10**5);
            _mint(FalconSwapV3factory(factory).protocolManager(), _feeAmount);
            liquidity = liquidity.sub(_feeAmount);
        }

        _mint(to, liquidity);

        emit Mint(from, _ethAmount, _tokenAmount);
    }

    function addLiquidityETHonCreate(uint _tokenAmountMin, uint _tokenAmountMax, address from, address to, uint deadline) payable external ensure(deadline) returns (uint liquidity) {
        require(msg.sender == factory, 'dont be so smart');
        liquidity = _addLiquidityETHinternal(_tokenAmountMin, _tokenAmountMax, from, to);
    }
    
    function addLiquidityETH(uint _tokenAmountMin, uint _tokenAmountMax, address to, uint deadline) payable external ensure(deadline) returns (uint liquidity) {
        liquidity = _addLiquidityETHinternal(_tokenAmountMin, _tokenAmountMax, msg.sender, to);
    }

    function removeLiquidity(uint liquidity, address to, uint deadline) external ensure(deadline) returns (uint _ethAmount, uint _tokenAmount) {
        require(liquidity > 0, 'no liquidity');
        IERC20 _token_inter = IERC20(token);

        uint reserveEth = address(this).balance;
        uint reserveToken = _token_inter.balanceOf(address(this));

        uint _totalSupply = totalSupply; 
        _ethAmount = liquidity.mul(reserveEth) / _totalSupply; 
        _tokenAmount = liquidity.mul(reserveToken) / _totalSupply; 
        require(_ethAmount > 0 && _tokenAmount > 0, 'liquidity burn issue');

        _burn(msg.sender, liquidity);

        _token_inter.safeTransfer(to, _tokenAmount);
        safeTransferETH(to, _ethAmount);

        emit Burn(msg.sender, _ethAmount, _tokenAmount, to);
    }
    
    function rescueTokens(address _token, address to) external {
        require(msg.sender == factory, 'dont be so smart');
        require(_token != token, "can't rescue base token");
        IERC20(_token).safeTransfer(to, IERC20(_token).balanceOf(address(this)));
    }
}

contract FalconSwapV3factory {
    uint public fee;
    address public pairCodeAddress;
    address public protocolManager;

    mapping(address => address) public getPair;
    address[] public allPairs;

    event PairCreated(address indexed token, address pair, uint);
    event protocolManagerChanged(address indexed previousManager, address indexed newManager);
    event feeUpdated(uint previousFee, uint newFee);

    modifier onlyOwner() {
        require(protocolManager == msg.sender, "no access");
        _;
    }

    constructor() {
        protocolManager = msg.sender;
        FalconSwapV3Pool pairContract = new FalconSwapV3Pool();
        pairCodeAddress = address(pairContract);
    }

    function allPairsLength() external view returns (uint) {
        return allPairs.length;
    }

    function createPair(address token) public returns (address pair) {
        require(token != address(0), 'zero address');
        require(getPair[token] == address(0), 'pair already created');

        address payable _proxyAddress;
        bytes20 targetBytes = bytes20(pairCodeAddress);
        bytes32 salt = keccak256(abi.encodePacked(token));
        
        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            _proxyAddress := create2(0, clone, 0x37, salt)
        }
        
        pair = address(_proxyAddress);
        FalconSwapV3Pool(pair).setup(token);

        getPair[token] = pair;
        allPairs.push(pair);
        emit PairCreated(token, pair, allPairs.length);
    }

    function createPairWithAddLiquidityETH(address token, uint _tokenAmountMin, uint _tokenAmountMax, address to, uint deadline) payable external returns (address pair, uint liquidity) {
        pair = getPair[token];
        if(pair == address(0)){ pair = createPair(token); }
        liquidity = FalconSwapV3Pool(pair).addLiquidityETHonCreate{value: msg.value}(_tokenAmountMin, _tokenAmountMax, msg.sender, to, deadline);
    }
    
    function changeFee(uint _fee) external onlyOwner {
        require(_fee < 10000, "invalid fee");
        emit feeUpdated(fee, _fee);
        fee = _fee;
    }
    
    function changeProtocolManager(address _protocolManager) external onlyOwner {
        require(_protocolManager != address(0), "zero address");
        emit protocolManagerChanged(protocolManager, _protocolManager);
        protocolManager = _protocolManager;
    }
    
    function rescueTokens(address token, address to) external onlyOwner {
        require(token != address(0), "zero address");
        require(token != to, "to / token issue");
        require(IERC20(token).transfer(to, IERC20(token).balanceOf(address(this))), "can't process");
    }

    function rescueTokensFromPool(address pool, address token, address to) external onlyOwner {
        require(pool != address(0), "zero address");
        require(token != address(0), "zero address");
        require(token != to, "to / token issue");
        FalconSwapV3Pool(pool).rescueTokens(token, to);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"feeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"protocolManagerChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_protocolManager","type":"address"}],"name":"changeProtocolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_tokenAmountMin","type":"uint256"},{"internalType":"uint256","name":"_tokenAmountMax","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"createPairWithAddLiquidityETH","outputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairCodeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueTokensFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600280546001600160a01b0319163317905560405160009061003290610075565b604051809103906000f08015801561004e573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905550610082565b61225c80610c3083390190565b610b9f806100916000396000f3fe6080604052600436106100a75760003560e01c80636a1db1bf116100645780636a1db1bf146101b25780639ae49151146101d25780639ccb0744146101f2578063ab4b669214610212578063c90f443814610232578063ddca3f431461025257600080fd5b80630b0cae2e146100ac5780631a788a02146100ce5780631e3dd18b146101215780635194cf97146101415780635431c94e14610173578063574f2ba314610193575b600080fd5b3480156100b857600080fd5b506100cc6100c73660046109e6565b610268565b005b3480156100da57600080fd5b506101046100e9366004610a29565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012d57600080fd5b5061010461013c366004610a4b565b6103a3565b61015461014f366004610a64565b6103cd565b604080516001600160a01b039093168352602083019190915201610118565b34801561017f57600080fd5b506100cc61018e366004610ab2565b610491565b34801561019f57600080fd5b506004545b604051908152602001610118565b3480156101be57600080fd5b506100cc6101cd366004610a4b565b610656565b3480156101de57600080fd5b50600154610104906001600160a01b031681565b3480156101fe57600080fd5b5061010461020d366004610a29565b610700565b34801561021e57600080fd5b50600254610104906001600160a01b031681565b34801561023e57600080fd5b506100cc61024d366004610a29565b61091e565b34801561025e57600080fd5b506101a460005481565b6002546001600160a01b0316331461029b5760405162461bcd60e51b815260040161029290610ae5565b60405180910390fd5b6001600160a01b0383166102c15760405162461bcd60e51b815260040161029290610b08565b6001600160a01b0382166102e75760405162461bcd60e51b815260040161029290610b08565b806001600160a01b0316826001600160a01b03160361033b5760405162461bcd60e51b815260206004820152601060248201526f746f202f20746f6b656e20697373756560801b6044820152606401610292565b604051632a18e4a760e11b81526001600160a01b0383811660048301528281166024830152841690635431c94e90604401600060405180830381600087803b15801561038657600080fd5b505af115801561039a573d6000803e3d6000fd5b50505050505050565b600481815481106103b357600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0380861660009081526003602052604081205490911690816103fc576103f987610700565b91505b604051632e74ba7d60e11b815260048101879052602481018690523360448201526001600160a01b03858116606483015260848201859052831690635ce974fa90349060a40160206040518083038185885af1158015610460573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906104859190610b2e565b90509550959350505050565b6002546001600160a01b031633146104bb5760405162461bcd60e51b815260040161029290610ae5565b6001600160a01b0382166104e15760405162461bcd60e51b815260040161029290610b08565b806001600160a01b0316826001600160a01b0316036105355760405162461bcd60e51b815260206004820152601060248201526f746f202f20746f6b656e20697373756560801b6044820152606401610292565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a79190610b2e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610b47565b6106525760405162461bcd60e51b815260206004820152600d60248201526c63616e27742070726f6365737360981b6044820152606401610292565b5050565b6002546001600160a01b031633146106805760405162461bcd60e51b815260040161029290610ae5565b61271081106106bf5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b6044820152606401610292565b60005460408051918252602082018390527fed28c14db89870da08d76b69e3f96d95cbb779778f62a9ea4d4d41dc082d088a910160405180910390a1600055565b60006001600160a01b0382166107285760405162461bcd60e51b815260040161029290610b08565b6001600160a01b0382811660009081526003602052604090205416156107875760405162461bcd60e51b81526020600482015260146024820152731c185a5c88185b1c9958591e4818dc99585d195960621b6044820152606401610292565b6001546040516bffffffffffffffffffffffff19606085811b82166020840152600093901b16908290603401604051602081830303815290604052805190602001209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f56040516366d3820360e01b81526001600160a01b03888116600483015291965086955090851691506366d3820390602401600060405180830381600087803b15801561085857600080fd5b505af115801561086c573d6000803e3d6000fd5b505050506001600160a01b03858116600081815260036020908152604080832080546001600160a01b0319908116968b1696871790915560048054600181018255948190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909401805490911686179055915482519485529084015290917fc1db9ba7c4b7ce660fe8d17bbcf07167549381df2abd694a970bd1402d86d313910160405180910390a2505050919050565b6002546001600160a01b031633146109485760405162461bcd60e51b815260040161029290610ae5565b6001600160a01b03811661096e5760405162461bcd60e51b815260040161029290610b08565b6002546040516001600160a01b038084169216907f8c7e8c788bb7e0c8d72c6354f85fcc68ca4e08298f3df85999b86aa46d99b0a590600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b03811681146109e157600080fd5b919050565b6000806000606084860312156109fb57600080fd5b610a04846109ca565b9250610a12602085016109ca565b9150610a20604085016109ca565b90509250925092565b600060208284031215610a3b57600080fd5b610a44826109ca565b9392505050565b600060208284031215610a5d57600080fd5b5035919050565b600080600080600060a08688031215610a7c57600080fd5b610a85866109ca565b94506020860135935060408601359250610aa1606087016109ca565b949793965091946080013592915050565b60008060408385031215610ac557600080fd5b610ace836109ca565b9150610adc602084016109ca565b90509250929050565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b600060208284031215610b4057600080fd5b5051919050565b600060208284031215610b5957600080fd5b81518015158114610a4457600080fdfea2646970667358221220e5f8d97e0b1d388e68aba4924b075cdb138a8731ca715c2871c71f1fb3a1b75c64736f6c634300080d0033608060405234801561001057600080fd5b5061223c806100206000396000f3fe6080604052600436106101665760003560e01c806366d38203116100d1578063c45a01551161008a578063dd62ed3e11610064578063dd62ed3e14610482578063e8063bea146104ba578063fc0c546a146104cd578063ffee770f146104ed57600080fd5b8063c45a01551461040f578063c4ccdeea1461042f578063d21220a71461046457600080fd5b806366d382031461033d57806370a082311461035d57806375f355f91461038a57806395d89b411461039d578063a9059cbb146103cf578063aa20a83a146103ef57600080fd5b8063313ce56711610123578063313ce56714610299578063443cb4bc146102c05780635431c94e146102d35780635a76f25e146102f55780635c7e072b1461030a5780635ce974fa1461032a57600080fd5b806306fdde031461016b5780630902f1ac146101ba578063095ea7b3146101ea5780630dfe16811461021a57806318160ddd1461025557806323b872dd14610279575b600080fd5b34801561017757600080fd5b506101a46040518060400160405280600d81526020016c46616c636f6e5377617020563360981b81525081565b6040516101b19190611e6e565b60405180910390f35b3480156101c657600080fd5b506101cf610500565b604080519384526020840192909252908201526060016101b1565b3480156101f657600080fd5b5061020a610205366004611eb9565b610581565b60405190151581526020016101b1565b34801561022657600080fd5b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b6040516001600160a01b0390911681526020016101b1565b34801561026157600080fd5b5061026b60005481565b6040519081526020016101b1565b34801561028557600080fd5b5061020a610294366004611ee5565b610598565b3480156102a557600080fd5b506102ae601281565b60405160ff90911681526020016101b1565b3480156102cc57600080fd5b504761026b565b3480156102df57600080fd5b506102f36102ee366004611f26565b61062d565b005b34801561030157600080fd5b5061026b610760565b34801561031657600080fd5b5061026b610325366004611f5f565b6107d2565b61026b610338366004611f9e565b61093f565b34801561034957600080fd5b506102f3610358366004611ff0565b6109c6565b34801561036957600080fd5b5061026b610378366004611ff0565b60016020526000908152604090205481565b61026b610398366004611f5f565b610a4e565b3480156103a957600080fd5b506101a4604051806040016040528060068152602001654653572d563360d01b81525081565b3480156103db57600080fd5b5061020a6103ea366004611eb9565b610a87565b3480156103fb57600080fd5b5061026b61040a366004611f5f565b610a94565b34801561041b57600080fd5b5060045461023d906001600160a01b031681565b34801561043b57600080fd5b5061044f61044a36600461200d565b610bdd565b604080519283526020830191909152016101b1565b34801561047057600080fd5b506003546001600160a01b031661023d565b34801561048e57600080fd5b5061026b61049d366004611f26565b600260209081526000928352604080842090915290825290205481565b61026b6104c836600461200d565b610db5565b3480156104d957600080fd5b5060035461023d906001600160a01b031681565b61026b6104fb36600461200d565b610f44565b6003546040516370a0823160e01b81523060048201526000918291829147916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105759190612034565b42925092509250909192565b600061058e338484611095565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610617576001600160a01b03841660009081526002602090815260408083203384529091529020546105f290836110f7565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b61062284848461114d565b5060015b9392505050565b6004546001600160a01b0316331461067f5760405162461bcd60e51b815260206004820152601060248201526f191bdb9d081899481cdbc81cdb585c9d60821b60448201526064015b60405180910390fd5b6003546001600160a01b03908116908316036106dd5760405162461bcd60e51b815260206004820152601760248201527f63616e277420726573637565206261736520746f6b656e0000000000000000006044820152606401610676565b6040516370a0823160e01b815230600482015261075c9082906001600160a01b038516906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b9190612034565b6001600160a01b03851691906111f3565b5050565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd9190612034565b905090565b600081428110156107f55760405162461bcd60e51b81526004016106769061204d565b6003546040516370a0823160e01b81523060048201526001600160a01b0390911690479060009083906370a0823190602401602060405180830381865afa158015610844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108689190612034565b905061087589828461125b565b9450848811156108975760405162461bcd60e51b815260040161067690612072565b6108ac6001600160a01b03841633308c611331565b6108b6878661136f565b604080516000808252602082018c9052818301889052606082015290516001600160a01b0389169133916000805160206121c78339815191529181900360800190a36000805160206121e783398151915261091183876110f7565b61091b838c611422565b6040805192835260208301919091520160405180910390a150505050949350505050565b600081428110156109625760405162461bcd60e51b81526004016106769061204d565b6004546001600160a01b031633146109af5760405162461bcd60e51b815260206004820152601060248201526f191bdb9d081899481cdbc81cdb585c9d60821b6044820152606401610676565b6109bb87878787611477565b979650505050505050565b600454600160a01b900460ff1615610a105760405162461bcd60e51b815260206004820152600d60248201526c0416c726561647920536574757609c1b6044820152606401610676565b60048054600380546001600160a01b039094166001600160a01b0319909416939093179092556001600160a81b03199091163317600160a01b179055565b60008142811015610a715760405162461bcd60e51b81526004016106769061204d565b610a7d86863387611477565b9695505050505050565b600061058e33848461114d565b60008142811015610ab75760405162461bcd60e51b81526004016106769061204d565b6003546040516370a0823160e01b81523060048201526001600160a01b0390911690479060009083906370a0823190602401602060405180830381865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a9190612034565b9050610b37898284611913565b945087851115610b595760405162461bcd60e51b815260040161067690612072565b610b6e6001600160a01b038416333088611331565b610b78878a61136f565b604080516000808252602082018890528183018c9052606082015290516001600160a01b0389169133916000805160206121c78339815191529181900360800190a36000805160206121e7833981519152610bd3838b6110f7565b61091b8388611422565b6000808242811015610c015760405162461bcd60e51b81526004016106769061204d565b60008611610c405760405162461bcd60e51b815260206004820152600c60248201526b6e6f206c697175696469747960a01b6044820152606401610676565b6003546040516370a0823160e01b81523060048201526001600160a01b0390911690479060009083906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612034565b60005490915080610cc48b856119e5565b610cce91906120b0565b965080610cdb8b846119e5565b610ce591906120b0565b9550600087118015610cf75750600086115b610d3a5760405162461bcd60e51b81526020600482015260146024820152736c6971756964697479206275726e20697373756560601b6044820152606401610676565b610d44338b611a4c565b610d586001600160a01b0385168a886111f3565b610d62898861136f565b60408051888152602081018890526001600160a01b038b169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050935093915050565b60008142811015610dd85760405162461bcd60e51b81526004016106769061204d565b6003546001600160a01b03166000610df047346110f7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5e9190612034565b9050610e6b888383611913565b945034851115610e8d5760405162461bcd60e51b815260040161067690612072565b610ea16001600160a01b038416888a6111f3565b84341115610ebc57610ebc33610eb734886110f7565b61136f565b6040805186815260006020820181905281830152606081018a905290516001600160a01b0389169133916000805160206121c78339815191529181900360800190a36000805160206121e7833981519152610f178387611422565b610f21838b6110f7565b6040805192835260208301919091520160405180910390a1505050509392505050565b60008142811015610f675760405162461bcd60e51b81526004016106769061204d565b6003546001600160a01b03166000610f7f47346110f7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612034565b9050610ffa34838361125b565b94508488111561101c5760405162461bcd60e51b815260040161067690612072565b6110306001600160a01b03841688876111f3565b60408051348152600060208201819052818301526060810187905290516001600160a01b0389169133916000805160206121c78339815191529181900360800190a36000805160206121e783398151915261108b8334611422565b610f2183886110f7565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008261110483826120d2565b91508111156105925760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610676565b6001600160a01b03831660009081526001602052604090205461117090826110f7565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461119f9082611422565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110ea9085815260200190565b6040516001600160a01b03831660248201526044810182905261125690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ade565b505050565b60008084116112c35760405162461bcd60e51b815260206004820152602e60248201527f46616c636f6e5377617056334c6962726172793a20494e53554646494349454e60448201526d1517d25394155517d05353d5539560921b6064820152608401610676565b6000831180156112d35750600082115b6112ef5760405162461bcd60e51b8152600401610676906120e9565b60006112fd856103e56119e5565b9050600061130b82856119e5565b905060006113258361131f886103e86119e5565b90611422565b90506109bb81836120b0565b6040516001600160a01b03808516602483015283166044820152606481018290526113699085906323b872dd60e01b9060840161121f565b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516113999190612134565b60006040518083038185875af1925050503d80600081146113d6576040519150601f19603f3d011682016040523d82523d6000602084013e6113db565b606091505b50509050806112565760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610676565b60008261142f8382612150565b91508110156105925760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610676565b600080341180156114885750600085115b6114c65760405162461bcd60e51b815260206004820152600f60248201526e696e76616c696420616d6f756e747360881b6044820152606401610676565b60035434906001600160a01b031660006114e047846110f7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190612034565b6000805491925081156115fe5761156f8461156934866119e5565b90611bb0565b90508a8110156115b55760405162461bcd60e51b815260206004820152601160248201527077726f6e6720746f6b656e20726174696f60781b6044820152606401610676565b898111156115f95760405162461bcd60e51b815260206004820152601160248201527077726f6e6720746f6b656e20726174696f60781b6044820152606401610676565b611601565b50895b6116166001600160a01b0386168a3084611331565b6040516370a0823160e01b815230600482015261168a9082906001600160a01b038816906370a0823190602401602060405180830381865afa158015611660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116849190612034565b906110f7565b83146116e25760405162461bcd60e51b815260206004820152602160248201527f6465666c6174696f6e61727920746f6b656e73206e6f7420737570706f7274656044820152601960fa1b6064820152608401610676565b81600003611716576117026103e86116846116fd89856119e5565b611bc8565b965061171160006103e8611c38565b61174b565b6117488461172488856119e5565b61172e91906120b0565b8461173984866119e5565b61174391906120b0565b611cbb565b96505b600087116117925760405162461bcd60e51b81526020600482015260146024820152736c6971756964697479206d696e7420697373756560601b6044820152606401610676565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180b9190612034565b905080156118b6576000611826620186a06115698b856119e5565b90506118a8600460009054906101000a90046001600160a01b03166001600160a01b031663ab4b66926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a29190612168565b82611c38565b6118b289826110f7565b9850505b6118c08989611c38565b60408051888152602081018490526001600160a01b038c16917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250505050505050949350505050565b600080841161197c5760405162461bcd60e51b815260206004820152602f60248201527f46616c636f6e5377617056334c6962726172793a20494e53554646494349454e60448201526e1517d3d55514155517d05353d55395608a1b6064820152608401610676565b60008311801561198c5750600082115b6119a85760405162461bcd60e51b8152600401610676906120e9565b60006119c06103e86119ba86886119e5565b906119e5565b905060006119d46103e56119ba86896110f7565b9050610a7d600161131f83856120b0565b6000811580611a09575082826119fb8183612185565b9250611a0790836120b0565b145b6105925760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610676565b6001600160a01b038216600090815260016020526040902054611a6f90826110f7565b6001600160a01b03831660009081526001602052604081209190915554611a9690826110f7565b60009081556040518281526001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000611b33826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611cd19092919063ffffffff16565b8051909150156112565780806020019051810190611b5191906121a4565b6112565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610676565b6000808211611bbe57600080fd5b61062682846120b0565b60006003821115611c295750806000611be26002836120b0565b611bed906001612150565b90505b81811015611c2357905080600281611c0881866120b0565b611c129190612150565b611c1c91906120b0565b9050611bf0565b50919050565b8115611c33575060015b919050565b600054611c459082611422565b60009081556001600160a01b038316815260016020526040902054611c6a9082611422565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611ad29085815260200190565b6000818310611cca5781610626565b5090919050565b6060611ce08484600085611ce8565b949350505050565b606082471015611d495760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610676565b6001600160a01b0385163b611da05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610676565b600080866001600160a01b03168587604051611dbc9190612134565b60006040518083038185875af1925050503d8060008114611df9576040519150601f19603f3d011682016040523d82523d6000602084013e611dfe565b606091505b50915091506109bb82828660608315611e18575081610626565b825115611e285782518084602001fd5b8160405162461bcd60e51b81526004016106769190611e6e565b60005b83811015611e5d578181015183820152602001611e45565b838111156113695750506000910152565b6020815260008251806020840152611e8d816040850160208701611e42565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611eb657600080fd5b50565b60008060408385031215611ecc57600080fd5b8235611ed781611ea1565b946020939093013593505050565b600080600060608486031215611efa57600080fd5b8335611f0581611ea1565b92506020840135611f1581611ea1565b929592945050506040919091013590565b60008060408385031215611f3957600080fd5b8235611f4481611ea1565b91506020830135611f5481611ea1565b809150509250929050565b60008060008060808587031215611f7557600080fd5b84359350602085013592506040850135611f8e81611ea1565b9396929550929360600135925050565b600080600080600060a08688031215611fb657600080fd5b85359450602086013593506040860135611fcf81611ea1565b92506060860135611fdf81611ea1565b949793965091946080013592915050565b60006020828403121561200257600080fd5b813561062681611ea1565b60008060006060848603121561202257600080fd5b833592506020840135611f1581611ea1565b60006020828403121561204657600080fd5b5051919050565b6020808252600b908201526a1d1e1b88195e1c1a5c995960aa1b604082015260600190565b6020808252600e908201526d736c69707061676520697373756560901b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826120cd57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156120e4576120e461209a565b500390565b6020808252602b908201527f46616c636f6e5377617056334c6962726172793a20494e53554646494349454e60408201526a545f4c495155494449545960a81b606082015260800190565b60008251612146818460208701611e42565b9190910192915050565b600082198211156121635761216361209a565b500190565b60006020828403121561217a57600080fd5b815161062681611ea1565b600081600019048311821515161561219f5761219f61209a565b500290565b6000602082840312156121b657600080fd5b8151801515811461062657600080fdfed78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822cf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848aa2646970667358221220a73bafd87f3ee2403583b214eebb9c9775e01a9a390e245e4f906bc1b254288564736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106100a75760003560e01c80636a1db1bf116100645780636a1db1bf146101b25780639ae49151146101d25780639ccb0744146101f2578063ab4b669214610212578063c90f443814610232578063ddca3f431461025257600080fd5b80630b0cae2e146100ac5780631a788a02146100ce5780631e3dd18b146101215780635194cf97146101415780635431c94e14610173578063574f2ba314610193575b600080fd5b3480156100b857600080fd5b506100cc6100c73660046109e6565b610268565b005b3480156100da57600080fd5b506101046100e9366004610a29565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561012d57600080fd5b5061010461013c366004610a4b565b6103a3565b61015461014f366004610a64565b6103cd565b604080516001600160a01b039093168352602083019190915201610118565b34801561017f57600080fd5b506100cc61018e366004610ab2565b610491565b34801561019f57600080fd5b506004545b604051908152602001610118565b3480156101be57600080fd5b506100cc6101cd366004610a4b565b610656565b3480156101de57600080fd5b50600154610104906001600160a01b031681565b3480156101fe57600080fd5b5061010461020d366004610a29565b610700565b34801561021e57600080fd5b50600254610104906001600160a01b031681565b34801561023e57600080fd5b506100cc61024d366004610a29565b61091e565b34801561025e57600080fd5b506101a460005481565b6002546001600160a01b0316331461029b5760405162461bcd60e51b815260040161029290610ae5565b60405180910390fd5b6001600160a01b0383166102c15760405162461bcd60e51b815260040161029290610b08565b6001600160a01b0382166102e75760405162461bcd60e51b815260040161029290610b08565b806001600160a01b0316826001600160a01b03160361033b5760405162461bcd60e51b815260206004820152601060248201526f746f202f20746f6b656e20697373756560801b6044820152606401610292565b604051632a18e4a760e11b81526001600160a01b0383811660048301528281166024830152841690635431c94e90604401600060405180830381600087803b15801561038657600080fd5b505af115801561039a573d6000803e3d6000fd5b50505050505050565b600481815481106103b357600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0380861660009081526003602052604081205490911690816103fc576103f987610700565b91505b604051632e74ba7d60e11b815260048101879052602481018690523360448201526001600160a01b03858116606483015260848201859052831690635ce974fa90349060a40160206040518083038185885af1158015610460573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906104859190610b2e565b90509550959350505050565b6002546001600160a01b031633146104bb5760405162461bcd60e51b815260040161029290610ae5565b6001600160a01b0382166104e15760405162461bcd60e51b815260040161029290610b08565b806001600160a01b0316826001600160a01b0316036105355760405162461bcd60e51b815260206004820152601060248201526f746f202f20746f6b656e20697373756560801b6044820152606401610292565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a79190610b2e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610b47565b6106525760405162461bcd60e51b815260206004820152600d60248201526c63616e27742070726f6365737360981b6044820152606401610292565b5050565b6002546001600160a01b031633146106805760405162461bcd60e51b815260040161029290610ae5565b61271081106106bf5760405162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b6044820152606401610292565b60005460408051918252602082018390527fed28c14db89870da08d76b69e3f96d95cbb779778f62a9ea4d4d41dc082d088a910160405180910390a1600055565b60006001600160a01b0382166107285760405162461bcd60e51b815260040161029290610b08565b6001600160a01b0382811660009081526003602052604090205416156107875760405162461bcd60e51b81526020600482015260146024820152731c185a5c88185b1c9958591e4818dc99585d195960621b6044820152606401610292565b6001546040516bffffffffffffffffffffffff19606085811b82166020840152600093901b16908290603401604051602081830303815290604052805190602001209050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260148201526e5af43d82803e903d91602b57fd5bf360881b6028820152816037826000f56040516366d3820360e01b81526001600160a01b03888116600483015291965086955090851691506366d3820390602401600060405180830381600087803b15801561085857600080fd5b505af115801561086c573d6000803e3d6000fd5b505050506001600160a01b03858116600081815260036020908152604080832080546001600160a01b0319908116968b1696871790915560048054600181018255948190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909401805490911686179055915482519485529084015290917fc1db9ba7c4b7ce660fe8d17bbcf07167549381df2abd694a970bd1402d86d313910160405180910390a2505050919050565b6002546001600160a01b031633146109485760405162461bcd60e51b815260040161029290610ae5565b6001600160a01b03811661096e5760405162461bcd60e51b815260040161029290610b08565b6002546040516001600160a01b038084169216907f8c7e8c788bb7e0c8d72c6354f85fcc68ca4e08298f3df85999b86aa46d99b0a590600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b03811681146109e157600080fd5b919050565b6000806000606084860312156109fb57600080fd5b610a04846109ca565b9250610a12602085016109ca565b9150610a20604085016109ca565b90509250925092565b600060208284031215610a3b57600080fd5b610a44826109ca565b9392505050565b600060208284031215610a5d57600080fd5b5035919050565b600080600080600060a08688031215610a7c57600080fd5b610a85866109ca565b94506020860135935060408601359250610aa1606087016109ca565b949793965091946080013592915050565b60008060408385031215610ac557600080fd5b610ace836109ca565b9150610adc602084016109ca565b90509250929050565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b600060208284031215610b4057600080fd5b5051919050565b600060208284031215610b5957600080fd5b81518015158114610a4457600080fdfea2646970667358221220e5f8d97e0b1d388e68aba4924b075cdb138a8731ca715c2871c71f1fb3a1b75c64736f6c634300080d0033

Deployed Bytecode Sourcemap

18078:3316:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21076:315;;;;;;;;;;-1:-1:-1;21076:315:0;;;;;:::i;:::-;;:::i;:::-;;18212:42;;;;;;;;;;-1:-1:-1;18212:42:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;18212:42:0;;;;;;-1:-1:-1;;;;;886:32:1;;;868:51;;856:2;841:18;18212:42:0;;;;;;;;18261:25;;;;;;;;;;-1:-1:-1;18261:25:0;;;;;:::i;:::-;;:::i;19888:429::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;1778:32:1;;;1760:51;;1842:2;1827:18;;1820:34;;;;1733:18;19888:429:0;1586:274:1;20783:285:0;;;;;;;;;;-1:-1:-1;20783:285:0;;;;;:::i;:::-;;:::i;18809:96::-;;;;;;;;;;-1:-1:-1;18882:8:0;:15;18809:96;;;2276:25:1;;;2264:2;2249:18;18809:96:0;2130:177:1;20329:162:0;;;;;;;;;;-1:-1:-1;20329:162:0;;;;;:::i;:::-;;:::i;18136:30::-;;;;;;;;;;-1:-1:-1;18136:30:0;;;;-1:-1:-1;;;;;18136:30:0;;;18913:967;;;;;;;;;;-1:-1:-1;18913:967:0;;;;;:::i;:::-;;:::i;18173:30::-;;;;;;;;;;-1:-1:-1;18173:30:0;;;;-1:-1:-1;;;;;18173:30:0;;;20503:268;;;;;;;;;;-1:-1:-1;20503:268:0;;;;;:::i;:::-;;:::i;18114:15::-;;;;;;;;;;;;;;;;21076:315;18554:15;;-1:-1:-1;;;;;18554:15:0;18573:10;18554:29;18546:51;;;;-1:-1:-1;;;18546:51:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;21185:18:0;::::1;21177:43;;;;-1:-1:-1::0;;;21177:43:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21239:19:0;::::1;21231:44;;;;-1:-1:-1::0;;;21231:44:0::1;;;;;;;:::i;:::-;21303:2;-1:-1:-1::0;;;;;21294:11:0::1;:5;-1:-1:-1::0;;;;;21294:11:0::1;::::0;21286:40:::1;;;::::0;-1:-1:-1;;;21286:40:0;;3192:2:1;21286:40:0::1;::::0;::::1;3174:21:1::0;3231:2;3211:18;;;3204:30;-1:-1:-1;;;3250:18:1;;;3243:46;3306:18;;21286:40:0::1;2990:340:1::0;21286:40:0::1;21337:46;::::0;-1:-1:-1;;;21337:46:0;;-1:-1:-1;;;;;3565:15:1;;;21337:46:0::1;::::0;::::1;3547:34:1::0;3617:15;;;3597:18;;;3590:43;21337:35:0;::::1;::::0;::::1;::::0;3482:18:1;;21337:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21076:315:::0;;;:::o;18261:25::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18261:25:0;;-1:-1:-1;18261:25:0;:::o;19888:429::-;-1:-1:-1;;;;;20087:14:0;;;20039:12;20087:14;;;:7;:14;;;;;;;;;;;20112:51;;20143:17;20154:5;20143:10;:17::i;:::-;20136:24;;20112:51;20185:124;;-1:-1:-1;;;20185:124:0;;;;;3903:25:1;;;3944:18;;;3937:34;;;20284:10:0;4025:18:1;;;4018:43;-1:-1:-1;;;;;4097:15:1;;;4077:18;;;4070:43;4129:19;;;4122:35;;;20185:46:0;;;;;20239:9;;3875:19:1;;20185:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20173:136;;19888:429;;;;;;;;:::o;20783:285::-;18554:15;;-1:-1:-1;;;;;18554:15:0;18573:10;18554:29;18546:51;;;;-1:-1:-1;;;18546:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20870:19:0;::::1;20862:44;;;;-1:-1:-1::0;;;20862:44:0::1;;;;;;;:::i;:::-;20934:2;-1:-1:-1::0;;;;;20925:11:0::1;:5;-1:-1:-1::0;;;;;20925:11:0::1;::::0;20917:40:::1;;;::::0;-1:-1:-1;;;20917:40:0;;3192:2:1;20917:40:0::1;::::0;::::1;3174:21:1::0;3231:2;3211:18;;;3204:30;-1:-1:-1;;;3250:18:1;;;3243:46;3306:18;;20917:40:0::1;2990:340:1::0;20917:40:0::1;21003:38;::::0;-1:-1:-1;;;21003:38:0;;21035:4:::1;21003:38;::::0;::::1;868:51:1::0;-1:-1:-1;;;;;20976:22:0;::::1;::::0;::::1;::::0;20999:2;;20976:22;;21003:23:::1;::::0;841:18:1;;21003:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20976:66;::::0;-1:-1:-1;;;;;;20976:66:0::1;::::0;;;;;;-1:-1:-1;;;;;1778:32:1;;;20976:66:0::1;::::0;::::1;1760:51:1::0;1827:18;;;1820:34;1733:18;;20976:66:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20968:92;;;::::0;-1:-1:-1;;;20968:92:0;;4841:2:1;20968:92:0::1;::::0;::::1;4823:21:1::0;4880:2;4860:18;;;4853:30;-1:-1:-1;;;4899:18:1;;;4892:43;4952:18;;20968:92:0::1;4639:337:1::0;20968:92:0::1;20783:285:::0;;:::o;20329:162::-;18554:15;;-1:-1:-1;;;;;18554:15:0;18573:10;18554:29;18546:51;;;;-1:-1:-1;;;18546:51:0;;;;;;;:::i;:::-;20404:5:::1;20397:4;:12;20389:36;;;::::0;-1:-1:-1;;;20389:36:0;;5183:2:1;20389:36:0::1;::::0;::::1;5165:21:1::0;5222:2;5202:18;;;5195:30;-1:-1:-1;;;5241:18:1;;;5234:41;5292:18;;20389:36:0::1;4981:335:1::0;20389:36:0::1;20452:3;::::0;20441:21:::1;::::0;;5495:25:1;;;5551:2;5536:18;;5529:34;;;20441:21:0::1;::::0;5468:18:1;20441:21:0::1;;;;;;;20473:3;:10:::0;20329:162::o;18913:967::-;18964:12;-1:-1:-1;;;;;18997:19:0;;18989:44;;;;-1:-1:-1;;;18989:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19052:14:0;;;19078:1;19052:14;;;:7;:14;;;;;;;:28;19044:61;;;;-1:-1:-1;;;19044:61:0;;5776:2:1;19044:61:0;;;5758:21:1;5815:2;5795:18;;;5788:30;-1:-1:-1;;;5834:18:1;;;5827:50;5894:18;;19044:61:0;5574:344:1;19044:61:0;19188:15;;19240:23;;-1:-1:-1;;19180:24:0;6068:15:1;;;6064:53;;19240:23:0;;;6052:66:1;19118:29:0;;19180:24;;;;19118:29;;6134:12:1;;19240:23:0;;;;;;;;;;;;19230:34;;;;;;19215:49;;19328:4;19322:11;-1:-1:-1;;;19354:5:0;19347:81;19467:11;19460:4;19453:5;19449:16;19442:37;-1:-1:-1;;;19511:4:0;19504:5;19500:16;19493:92;19640:4;19634;19627:5;19624:1;19616:29;19716:35;;-1:-1:-1;;;19716:35:0;;-1:-1:-1;;;;;886:32:1;;;19716:35:0;;;868:51:1;19599:46:0;;-1:-1:-1;19599:46:0;;-1:-1:-1;19716:28:0;;;;-1:-1:-1;19716:28:0;;841:18:1;;19716:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;19764:14:0;;;;;;;:7;:14;;;;;;;;:21;;-1:-1:-1;;;;;;19764:21:0;;;;;;;;;;;;19796:8;:19;;-1:-1:-1;19796:19:0;;;;;;;;;;;;;;;;;;;;;19856:15;;19831:41;;1760:51:1;;;1827:18;;;1820:34;19764:14:0;;19831:41;;1733:18:1;19831:41:0;;;;;;;18978:902;;;18913:967;;;:::o;20503:268::-;18554:15;;-1:-1:-1;;;;;18554:15:0;18573:10;18554:29;18546:51;;;;-1:-1:-1;;;18546:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20598:30:0;::::1;20590:55;;;;-1:-1:-1::0;;;20590:55:0::1;;;;;;;:::i;:::-;20684:15;::::0;20661:57:::1;::::0;-1:-1:-1;;;;;20661:57:0;;::::1;::::0;20684:15:::1;::::0;20661:57:::1;::::0;20684:15:::1;::::0;20661:57:::1;20729:15;:34:::0;;-1:-1:-1;;;;;;20729:34:0::1;-1:-1:-1::0;;;;;20729:34:0;;;::::1;::::0;;;::::1;::::0;;20503:268::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:334::-;269:6;277;285;338:2;326:9;317:7;313:23;309:32;306:52;;;354:1;351;344:12;306:52;377:29;396:9;377:29;:::i;:::-;367:39;;425:38;459:2;448:9;444:18;425:38;:::i;:::-;415:48;;482:38;516:2;505:9;501:18;482:38;:::i;:::-;472:48;;192:334;;;;;:::o;531:186::-;590:6;643:2;631:9;622:7;618:23;614:32;611:52;;;659:1;656;649:12;611:52;682:29;701:9;682:29;:::i;:::-;672:39;531:186;-1:-1:-1;;;531:186:1:o;930:180::-;989:6;1042:2;1030:9;1021:7;1017:23;1013:32;1010:52;;;1058:1;1055;1048:12;1010:52;-1:-1:-1;1081:23:1;;930:180;-1:-1:-1;930:180:1:o;1115:466::-;1210:6;1218;1226;1234;1242;1295:3;1283:9;1274:7;1270:23;1266:33;1263:53;;;1312:1;1309;1302:12;1263:53;1335:29;1354:9;1335:29;:::i;:::-;1325:39;;1411:2;1400:9;1396:18;1383:32;1373:42;;1462:2;1451:9;1447:18;1434:32;1424:42;;1485:38;1519:2;1508:9;1504:18;1485:38;:::i;:::-;1115:466;;;;-1:-1:-1;1115:466:1;;1570:3;1555:19;1542:33;;1115:466;-1:-1:-1;;1115:466:1:o;1865:260::-;1933:6;1941;1994:2;1982:9;1973:7;1969:23;1965:32;1962:52;;;2010:1;2007;2000:12;1962:52;2033:29;2052:9;2033:29;:::i;:::-;2023:39;;2081:38;2115:2;2104:9;2100:18;2081:38;:::i;:::-;2071:48;;1865:260;;;;;:::o;2312:332::-;2514:2;2496:21;;;2553:1;2533:18;;;2526:29;-1:-1:-1;;;2586:2:1;2571:18;;2564:39;2635:2;2620:18;;2312:332::o;2649:336::-;2851:2;2833:21;;;2890:2;2870:18;;;2863:30;-1:-1:-1;;;2924:2:1;2909:18;;2902:42;2976:2;2961:18;;2649:336::o;4168:184::-;4238:6;4291:2;4279:9;4270:7;4266:23;4262:32;4259:52;;;4307:1;4304;4297:12;4259:52;-1:-1:-1;4330:16:1;;4168:184;-1:-1:-1;4168:184:1:o;4357:277::-;4424:6;4477:2;4465:9;4456:7;4452:23;4448:32;4445:52;;;4493:1;4490;4483:12;4445:52;4525:9;4519:16;4578:5;4571:13;4564:21;4557:5;4554:32;4544:60;;4600:1;4597;4590:12

Swarm Source

ipfs://a73bafd87f3ee2403583b214eebb9c9775e01a9a390e245e4f906bc1b2542885

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.