ETH Price: $2,729.82 (-3.56%)
Gas: 0.82 Gwei

Contract

0x433384e6e167250C15fdBCd0F17978764d397d2D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Fee Pool123667592021-05-04 8:43:051375 days ago1620117785IN
0x433384e6...64d397d2D
0 ETH0.0016081135

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DextokenFactoryCollateral

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 19: DextokenFactoryCollateral.sol
// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity 0.5.17;

import "./Math.sol";
import "./SafeMath.sol";
import "./DextokenPoolCollateral.sol";


contract DextokenFactoryCollateral {
    using SafeMath for uint;

    event PoolCreated(address indexed token0, address indexed pair, address indexed creator, uint);

    address public owner;
    address public feePool;
    address public collateral;

    mapping(address => mapping(address => address)) private _allPools;
    address [] public allPoolsAddress;

    constructor(address token1) public {
        owner = msg.sender;
        feePool = address(0);
        collateral = token1;
    }

    function createPool(address token0, uint Ct, uint Pt) external returns (address pool) {
        require(token0 != address(0), 'createPool: zero address');
        require(feePool != address(0), 'createPool: feePool not set');
        require(_allPools[token0][msg.sender] == address(0), 'createPool: user pool exists');
        bytes memory bytecode = type(DextokenPoolCollateral).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(token0, collateral, msg.sender));
        /// precompute the address where a contract will be deployed
        assembly {
            pool := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        IDextokenPool(pool).initialize(token0, collateral, Ct, Pt);
        _allPools[token0][msg.sender] = pool;
        allPoolsAddress.push(pool);
        emit PoolCreated(token0, pool, msg.sender, allPoolsAddress.length);
        return pool;
    }

    function getFeePool() external view returns (address) {
        return feePool;
    }

    function setFeePool(address _feePool) external {
        require(msg.sender == owner, "setFeePool: Forbidden");
        feePool = _feePool;
    }

    function getAllPools() external view returns (address [] memory) {
        return allPoolsAddress;
    }   
}   

File 2 of 19: Address.sol
pragma solidity 0.5.17;


/**
 * @title Address
 * @dev Check if the address is a contract using eip-1052
 */
library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

File 3 of 19: Context.sol
pragma solidity 0.5.17;


contract Context {
    constructor () internal { }

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
}

File 4 of 19: DextokenPoolCollateral.sol
// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity 0.5.17;

import "./Math.sol";
import "./SafeMath.sol";
import "./SafeERC20.sol";
import "./ReentrancyGuard.sol";
import "./IDextokenPool.sol";
import "./IDextokenFactory.sol";
import "./LPToken.sol";


contract DextokenPoolCollateral is LPToken, IDextokenPool, ReentrancyGuard {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    /// AMM fee
    uint public constant FEE_BASE      = 100; // 1%
    uint public constant FEE_FACTOR    = 3;

    IDextokenFactory public factory;

    /// The collateral token
    IERC20 public COLLATERAL;

    /// Pooling
    uint public totalLiquidity;
    IERC20 public token0;

    /// Speculative AMM
    struct AMM {
        uint Ct;
        uint Pt;
        uint Nt;
        uint lastUpdateTime;
    }

    /// AMM states
    AMM private _AMM;

    modifier updatePriceTick() {   
        _;
        /// step the price tick (t+1)
        _AMM.lastUpdateTime = _lastPriceTickApplicable();   
    }

    constructor() public {
        factory = IDextokenFactory(msg.sender);
        _AMM.lastUpdateTime = 0;
        totalLiquidity = 0;
    }

    function initialize(address _token0, address _token1, uint _Ct, uint _Pt) 
        external 
    {
        require(msg.sender == address(factory), 'initialize: Forbidden');

        token0 = IERC20(_token0); 
        require(_Ct <= token0.totalSupply(), "initialize: Invalid _Ct");     
        
        /// snapshot of the pooled token
        _AMM.Ct = _Ct;
        _AMM.Pt = _Pt;
        _AMM.Nt = _AMM.Pt.mul(_AMM.Ct).div(1e18);

        /// The collateral token
        COLLATERAL = IERC20(_token1);  
    }

    function deposit(uint amount) 
        external 
        nonReentrant
        updatePriceTick()
    {
        require(amount > 0, "deposit: invalid amount");
        uint _totalBalance = getPoolBalance();
        address _token0 = address(token0);
        uint _Ct = _AMM.Ct.add(amount);
        uint _Nt = _AMM.Nt;

        // liquidity at price tick (t)
        uint spotPrice = getSpotPrice(_Ct, _Nt);
        uint liquidity = spotPrice.mul(amount);
        require(liquidity > 0, "deposit: invalid user liquidity");

        _totalBalance = _totalBalance.add(amount);
        uint _totalLiquidity = totalLiquidity.add(liquidity);

        // mint liquidity tokens
        uint mintedTokens = _calcLiquidityToken(_totalLiquidity, _totalBalance, liquidity);

        /// calculate the virtual collateral tokens at price tick (t)
        uint _Mb = COLLATERAL.balanceOf(address(this)).mul(mintedTokens).div(totalSupply().add(mintedTokens));

        // move price tick to (t+1) 
        _AMM.Ct = _Ct;
        _AMM.Nt = _Nt.add(_Mb);
        totalLiquidity = _totalLiquidity;

        // mint liquidity token at price tick (t+1)
        _mintLiquidityToken(msg.sender, mintedTokens);
        _tokenSafeTransferFrom(_token0, msg.sender, address(this), amount);
        emit TokenDeposit(_token0, msg.sender, amount, spotPrice);        
    }

    function withdraw(uint tokens) 
        external 
        nonReentrant
        updatePriceTick()
    {
        require(tokens > 0, "withdraw: invalid tokens");
        require(totalSupply() > 0, "withdraw: insufficient liquidity");
        require(balanceOf(msg.sender) >= tokens, "withdraw: insufficient tokens");
        address _token0 = address(token0);
      
        // liquidity at price tick (t)
        uint amount = liquidityTokenToAmount(tokens);

        /// calculate the collateral token shares
        uint balance = COLLATERAL.balanceOf(address(this));
        uint amountOut = balance.mul(tokens).div(totalSupply());

        /// Ensure the amountOut is not more than the balance in the contract.
        /// Preventing underflow due to very low values of the balance.        
        require(amountOut <= balance, "withdraw: insufficient ETH balance");

        // prepare for price tick (t+1)
        uint _Ct = _AMM.Ct;
        uint _Nt = _AMM.Nt;
        _Ct = _Ct.sub(amount);
        _Nt = _Nt.sub(amountOut);

        // liquidity at price tick (t+1)        
        uint spotPrice = getSpotPrice(_Ct, _Nt);
        totalLiquidity = spotPrice.mul(getPoolBalance().sub(amount));

        _AMM.Ct = _Ct;
        _AMM.Nt = _Nt;

        _tokenSafeTransfer(_token0, msg.sender, amount);
        _tokenSafeTransfer(address(COLLATERAL), msg.sender, amountOut);

        _burnLiquidityToken(msg.sender, tokens);
        emit TokenWithdraw(_token0, msg.sender, amount, spotPrice);
    }

    function swapExactETHForTokens(
        uint amountIn,
        uint minAmountOut,
        uint maxPrice,
        uint deadline
    )
        external 
        nonReentrant
        returns (uint)
    {
        require(COLLATERAL.balanceOf(msg.sender) >= amountIn, "swapExactETHForTokens: Insufficient collateral balance");
        require(deadline > _lastPriceTickApplicable(), "swapExactETHForTokens: Invalid transaction");
        require(amountIn > 0, "swapExactETHForTokens: Invalid amountIn");
        uint spotPrice;
        IERC20 _COLLATERAL = COLLATERAL;

        /// the price tick at (t)
        /// increase the collateral token supply including interests rate        
        {
            spotPrice = getSpotPrice(_AMM.Ct, _AMM.Nt.add(amountIn));
            require(spotPrice <= maxPrice, "swapExactETHForTokens: Invalid price slippage");
        }

        /// check amount out without fees
        uint amountOut = amountIn.mul(1e18).div(spotPrice);
        require(amountOut >= minAmountOut, "swapExactETHForTokens: Invalid amountOut");

        /// split fees and check exact amount out
        uint feeAmountIn = _calcFees(amountIn);
        uint exactAmountIn = amountIn.sub(feeAmountIn);
        uint exactAmountOut = exactAmountIn.mul(1e18).div(spotPrice);

        /// increase the collateral token supply
        _AMM.Nt = _AMM.Nt.add(exactAmountIn);
        spotPrice = getSpotPrice(_AMM.Ct.sub(exactAmountOut), _AMM.Nt);
        totalLiquidity = spotPrice.mul(getPoolBalance().sub(exactAmountOut));

        /// transfer the collateral tokens in
        _tokenSafeTransferFrom(address(_COLLATERAL), msg.sender, address(this), amountIn);
        
        /// transfer fees
        _tokenSafeTransfer(address(_COLLATERAL), factory.getFeePool(), feeAmountIn);

        /// move to the next price tick (t+1)
        _withdrawAndTransfer(msg.sender, exactAmountOut);

        emit SwapExactETHForTokens(address(this), exactAmountOut, amountIn, spotPrice, msg.sender);
        return exactAmountOut;
    } 

    function swapExactTokensForETH(
        uint amountIn,
        uint minAmountOut,
        uint minPrice,
        uint deadline
    )
        external 
        nonReentrant
        returns (uint)
    {
        require(token0.balanceOf(msg.sender) >= amountIn, "swapExactTokensForETH: Insufficient user balance");    
        require(deadline > _lastPriceTickApplicable(), "swapExactTokensForETH: Invalid order");
        require(amountIn > 0, "swapExactTokensForETH: Invalid amountIn");
        uint _Nt = _AMM.Nt;
        IERC20 _COLLATERAL = COLLATERAL;

        /// add liquidity at the price tick (t)
        uint spotPrice = getSpotPrice(_AMM.Ct.add(amountIn), _Nt);
        require(spotPrice >= minPrice, "swapExactTokensForETH: Invalid price slippage");

        /// user receives
        uint amountOut = spotPrice.mul(amountIn).div(1e18);
        require(_COLLATERAL.balanceOf(address(this)) >= amountOut, "swapExactTokensForETH: Insufficient collateral liquidity");
        require(amountOut >= minAmountOut, "swapExactTokensForETH: Invalid amountOut");

        /// split fees
        uint feeAmountOut = _calcFees(amountOut);
        uint exactAmountOut = amountOut.sub(feeAmountOut);

        /// decrease the collateral token, and add liquidity 
        /// providers' fee shares back to the pool
        _AMM.Nt = _Nt.sub(exactAmountOut);

        totalLiquidity = spotPrice.mul(getPoolBalance().add(amountIn));

        /// move the next price tick (t+1)
        _depositAndTransfer(msg.sender, amountIn);

        /// transfer the collateral token out
        _tokenSafeTransfer(address(_COLLATERAL), msg.sender, exactAmountOut);

        emit SwapExactTokensForETH(address(this), exactAmountOut, amountIn, spotPrice, msg.sender);
        return exactAmountOut;
    }

    function getLastUpdateTime() external view returns (uint) {
        return _AMM.lastUpdateTime;
    }  

    function getCirculatingSupply() external view returns (uint) {
        return _AMM.Ct;
    }    

    function getUserbase() external view returns (uint) {
        return _AMM.Nt;
    }

    function getToken() external view returns (address) {
        return address(token0);
    }

    function getTotalLiquidity() external view returns (uint) {
        return totalLiquidity.div(1e18);
    }  

    function liquidityOf(address account) external view returns (uint) {
        return balanceOf(account);
    }

    function liquiditySharesOf(address account) external view returns (uint) {
        uint userTokens = balanceOf(account);
        if (userTokens == 0) {
            return 0;
        }
        return totalSupply()
            .mul(1e18)
            .div(userTokens);
    }  

    function mean() public view returns (uint) {
        return _AMM.Nt
            .mul(_AMM.Pt);
    }

    function getPoolBalance() public view returns (uint) {
        return token0.balanceOf(address(this));
    }

    function getPrice() public view returns (uint) {
        return _AMM.Nt.mul(1e18).div(_AMM.Ct);
    }   

    function getSpotPrice(uint _Ct, uint _Nt) public pure returns (uint) {
        return _Nt.mul(1e18).div(_Ct);
    }

    function liquidityTokenToAmount(uint token) public view returns (uint) {
        if (totalSupply() == 0) {
            return 0;
        }        
        return getPoolBalance()
            .mul(token)
            .div(totalSupply());
    }  

    function liquidityFromAmount(uint amount) public view returns (uint) {
        return getPrice().mul(amount); 
    }

    function _depositAndTransfer(address account, uint amount) 
        internal
        updatePriceTick()
    {
        _AMM.Ct = _AMM.Ct.add(amount);    
        _tokenSafeTransferFrom(address(token0), account, address(this), amount);
    }

    function _withdrawAndTransfer(address account, uint amount) 
        internal
        updatePriceTick()
    {
        _AMM.Ct = _AMM.Ct.sub(amount);    
        _tokenSafeTransfer(address(token0), account, amount);
    }
    
    function _lastPriceTickApplicable() internal view returns (uint) {
        return Math.max(block.timestamp, _AMM.lastUpdateTime);
    }

    function _mintLiquidityToken(address to, uint amount) internal {
        _mint(address(this), amount);
        _transfer(address(this), to, amount);
    }

    function _burnLiquidityToken(address from, uint amount) internal {
        _transfer(from, address(this), amount);
        _burn(address(this), amount);
    } 

    function _calcFees(uint amount) internal pure returns (uint) {
        return amount.mul(FEE_FACTOR).div(FEE_BASE);
    }

    function _calcLiquidityToken(
        uint _totalLiquidity, 
        uint _totalBalance, 
        uint _liquidity
    ) 
        internal 
        pure 
        returns (uint) 
    {
        if (_totalLiquidity == 0) {
            return 0;
        }    
        return _totalBalance
            .mul(_liquidity)
            .div(_totalLiquidity);
    }

    function _tokenSafeTransfer(
        address token,
        address to,
        uint amount
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "_tokenSafeTransfer failed");
    }

    function _tokenSafeTransferFrom(
        address token,
        address from,
        address to,
        uint amount
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "_tokenSafeTransferFrom failed");
    }                    
}

File 5 of 19: ERC20.sol
pragma solidity 0.5.17;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";


/**
 * @dev The ERC20 standard implementation.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint;

    mapping (address => uint) private _balances;
    mapping (address => mapping (address => uint)) private _allowances;

    uint private _totalSupply;

    function totalSupply() public view returns (uint) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint) {
        return _balances[account];
    }

    function transfer(address recipient, uint amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view returns (uint) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

File 6 of 19: ERC20Detailed.sol
pragma solidity 0.5.17;

import "./IERC20.sol";


contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

File 7 of 19: IDextokenExchange.sol
pragma solidity 0.5.17;


interface IDextokenExchange {
    event SwapExactAmountOut(
        address indexed poolIn, 
        uint amountSwapIn, 
        address indexed poolOut, 
        uint exactAmountOut,
        address indexed to
    );

    event SwapExactAmountIn(
        address indexed poolIn, 
        uint amountSwapIn, 
        address indexed poolOut, 
        uint exactAmountOut,
        address indexed to
    );
    
	function swapMaxAmountOut(
        address poolIn,
        address poolOut, 
        uint maxAmountOut,
        uint deadline
    ) external;

    function swapExactAmountIn(
        address poolIn,
        address poolOut, 
        uint exactAmountIn,
        uint deadline
    ) external;  
}

File 8 of 19: IDextokenFactory.sol
pragma solidity 0.5.17;


interface IDextokenFactory {
    function getFeePool() external view returns (address);
}

File 9 of 19: IDextokenPool.sol
pragma solidity 0.5.17;


interface IDextokenPool {
    event TokenDeposit(
        address indexed token, 
        address indexed account, 
        uint amount,
        uint spotPrice
    );

    event TokenWithdraw(
        address indexed token, 
        address indexed account, 
        uint amount,
        uint spotPrice
    );

    event SwapExactETHForTokens(
        address indexed poolOut, 
        uint amountOut, 
        uint amountIn,
        uint spotPrice,
        address indexed account
    );

    event SwapExactTokensForETH(
        address indexed poolOut, 
        uint amountOut, 
        uint amountIn, 
        uint spotPrice,
        address indexed account
    );

    /// Speculative AMM
    function initialize(address _token0, address _token1, uint _Ct, uint _Pt) external;
    function mean() external view returns (uint);
    function getLastUpdateTime() external view returns (uint);
    function getCirculatingSupply() external view returns (uint);
    function getUserbase() external view returns (uint);
    function getPrice() external view returns (uint);
    function getSpotPrice(uint _Ct, uint _Nt) external pure returns (uint);
	function getToken() external view returns (address);

    /// Pool Management
    function getPoolBalance() external view returns (uint);    
    function getTotalLiquidity() external view returns (uint);
    function liquidityOf(address account) external view returns (uint);
    function liquiditySharesOf(address account) external view returns (uint);
    function liquidityTokenToAmount(uint token) external view returns (uint);
    function liquidityFromAmount(uint amount) external view returns (uint);
    function deposit(uint amount) external;
    function withdraw(uint tokens) external;

    /// Trading
    function swapExactETHForTokens(
        uint amountIn,
        uint minAmountOut,
        uint maxPrice,
        uint deadline
    ) external returns (uint);

    function swapExactTokensForETH(
        uint amountIn,
        uint minAmountOut,
        uint minPrice,
        uint deadline
    ) external returns (uint);
}

File 10 of 19: IERC20.sol
pragma solidity 0.5.17;


interface IERC20 {
    function totalSupply() external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function transfer(address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

File 11 of 19: IWETH.sol
pragma solidity 0.5.17;


interface IWETH {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function balanceOf(address) external view returns (uint);

    function allowance(address, address) external view returns (uint);

    function deposit() external payable;

    function withdraw(uint wad) external;

    function totalSupply() external view returns (uint);

    function approve(address guy, uint wad) external returns (bool);

    function transfer(address dst, uint wad) external returns (bool);

    function transferFrom(address src, address dst, uint wad) external returns (bool);
}

File 12 of 19: LPToken.sol
// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity 0.5.17;

import "./ERC20.sol";


contract LPToken is ERC20 {
    string public constant name     = "DEXG Liquidity Pool";
    string public constant symbol   = "DEXG-LP";
    uint8  public constant decimals = 18;
}

File 13 of 19: Math.sol
pragma solidity ^0.5.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

File 14 of 19: Migrations.sol
pragma solidity 0.5.17;

contract Migrations {
  address public owner;
  uint public last_completed_migration;

  constructor() public {
    owner = msg.sender;
  }

  modifier restricted() {
    if (msg.sender == owner) _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 15 of 19: Owned.sol
pragma solidity ^0.5.17;

contract Ownable {
    address public owner;
    address public newOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() public {
        owner = msg.sender;
        newOwner = address(0);
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyNewOwner() {
        require(msg.sender != address(0));
        require(msg.sender == newOwner);
        _;
    }
    
    function isOwner(address account) public view returns (bool) {
        if(account == owner) {
            return true;
        }
        else {
            return false;
        }
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0));
        newOwner = _newOwner;
    }

    function acceptOwnership() public onlyNewOwner {
        emit OwnershipTransferred(owner, newOwner);        
        owner = newOwner;
        newOwner = address(0);
    }
}

File 16 of 19: Pausable.sol
pragma solidity ^0.5.17;

import "./Owned.sol";


contract Pausable is Ownable {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () public {
        _paused = false;
    }    

    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    modifier whenPaused() {
        require(_paused);
        _;
    }

    function paused() public view returns (bool) {
        return _paused;
    }

    function pause() public onlyOwner whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyOwner whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

File 17 of 19: ReentrancyGuard.sol
pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

File 18 of 19: SafeERC20.sol
pragma solidity ^0.5.0;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";


library SafeERC20 {
    using SafeMath for uint;
    using Address for address;

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

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 19 of 19: SafeMath.sol
pragma solidity 0.5.17;


library SafeMath {
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint a, uint b) internal pure returns (uint) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        require(b <= a, errorMessage);
        uint c = a - b;

        return c;
    }
    function mul(uint a, uint b) internal pure returns (uint) {
        if (a == 0) {
            return 0;
        }

        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint a, uint b) internal pure returns (uint) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint c = a / b;

        return c;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"token1","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PoolCreated","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPoolsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"uint256","name":"Ct","type":"uint256"},{"internalType":"uint256","name":"Pt","type":"uint256"}],"name":"createPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feePool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllPools","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFeePool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feePool","type":"address"}],"name":"setFeePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051612df7380380612df78339818101604052602081101561003357600080fd5b5051600080546001600160a01b031990811633179091556001805482169055600280546001600160a01b0390931692909116919091179055612d7d8061007a6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063ae2e933b1161005b578063ae2e933b146100fe578063b039ddf614610106578063d88ff1f414610138578063d8dfeb451461019057610088565b806319db22281461008d57806338516064146100b55780638da5cb5b146100d9578063ad6048d8146100e1575b600080fd5b6100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610198565b005b6100bd610211565b604080516001600160a01b039092168252519081900360200190f35b6100bd610220565b6100bd600480360360208110156100f757600080fd5b503561022f565b6100bd610256565b6100bd6004803603606081101561011c57600080fd5b506001600160a01b038135169060208101359060400135610265565b610140610550565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561017c578181015183820152602001610164565b505050509050019250505060405180910390f35b6100bd6105b2565b6000546001600160a01b031633146101ef576040805162461bcd60e51b815260206004820152601560248201527439b2ba2332b2a837b7b61d102337b93134b23232b760591b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031690565b6000546001600160a01b031681565b6004818154811061023c57fe5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b031681565b60006001600160a01b0384166102c2576040805162461bcd60e51b815260206004820152601860248201527f637265617465506f6f6c3a207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6001546001600160a01b031661031f576040805162461bcd60e51b815260206004820152601b60248201527f637265617465506f6f6c3a20666565506f6f6c206e6f74207365740000000000604482015290519081900360640190fd5b6001600160a01b0384811660009081526003602090815260408083203384529091529020541615610397576040805162461bcd60e51b815260206004820152601c60248201527f637265617465506f6f6c3a207573657220706f6f6c2065786973747300000000604482015290519081900360640190fd5b6060604051806020016103a9906105c1565b601f1982820381018352601f9091011660408181526002546bffffffffffffffffffffffff1960608a811b821660208681019190915292811b909116603485015233901b60488401528151603c818503018152605c909301909152815191810191909120825192935091829184016000f56002546040805163eb990c5960e01b81526001600160a01b038a811660048301529283166024820152604481018990526064810188905290519295509085169163eb990c599160848082019260009290919082900301818387803b15801561048157600080fd5b505af1158015610495573d6000803e3d6000fd5b5050506001600160a01b038088166000818152600360209081526040808320338085529083528184208054968b166001600160a01b0319978816811790915560048054600181018255958190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909501805490971681179096559254815190815290519295507febbbe9dc3a19d2f959ac76ac0372b4983cdfb945f5d6aef4873c36fabb2ba8aa929081900390910190a450509392505050565b606060048054806020026020016040519081016040528092919081815260200182805480156105a857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161058a575b5050505050905090565b6002546001600160a01b031681565b61277a806105cf8339019056fe608060405234801561001057600080fd5b506001600355600480546001600160a01b031916331790556000600b819055600655612739806100416000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80634dfe0b1b11610125578063b6b55f25116100ad578063cc3644f11161007c578063cc3644f114610595578063dd62ed3e146105b2578063eb990c59146105e0578063ecefc7051461061c578063fd5c63b21461062457610211565b8063b6b55f2514610560578063b7f883201461057d578063c45a015514610585578063cbf950bd1461058d57610211565b806395d89b41116100f457806395d89b41146104f057806398d5fdca146104f8578063a457c2d714610500578063a9059cbb1461052c578063abd70aa21461055857610211565b80634dfe0b1b1461047f5780635556350d146104a55780635afbc4a8146104c257806370a08231146104ca57610211565b806324bbab8b116101a857806335c7e9251161017757806335c7e925146103d3578063376c4642146103db578063395093511461040a5780633c4750df146104365780633f8128821461045c57610211565b806324bbab8b146103865780632b112e491461038e5780632e1a7d4d14610396578063313ce567146103b557610211565b806318160ddd116101e457806318160ddd146103115780631d98cf401461031957806321df0da71461034857806323b872dd1461035057610211565b806306fdde0314610216578063095ea7b3146102935780630dfe1681146102d357806315770f92146102f7575b600080fd5b61021e61062c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf600480360360408110156102a957600080fd5b506001600160a01b03813516906020013561065b565b604080519115158252519081900360200190f35b6102db610679565b604080516001600160a01b039092168252519081900360200190f35b6102ff610688565b60408051918252519081900360200190f35b6102ff61068e565b6102ff6004803603608081101561032f57600080fd5b5080359060208101359060408101359060600135610694565b6102db610a8b565b6102bf6004803603606081101561036657600080fd5b506001600160a01b03813581169160208101359091169060400135610a9a565b6102db610b28565b6102ff610b37565b6103b3600480360360208110156103ac57600080fd5b5035610b3d565b005b6103bd610e94565b6040805160ff9092168252519081900360200190f35b6102ff610e99565b6102ff600480360360808110156103f157600080fd5b5080359060208101359060408101359060600135610ebc565b6102bf6004803603604081101561042057600080fd5b506001600160a01b03813516906020013561129a565b6102ff6004803603602081101561044c57600080fd5b50356001600160a01b03166112ee565b6102ff6004803603604081101561047257600080fd5b5080359060200135611301565b6102ff6004803603602081101561049557600080fd5b50356001600160a01b031661131f565b6102ff600480360360208110156104bb57600080fd5b5035611360565b6102ff61138d565b6102ff600480360360208110156104e057600080fd5b50356001600160a01b0316611392565b61021e6113ad565b6102ff6113d0565b6102bf6004803603604081101561051657600080fd5b506001600160a01b0381351690602001356113f5565b6102bf6004803603604081101561054257600080fd5b506001600160a01b038135169060200135611463565b6102ff611477565b6103b36004803603602081101561057657600080fd5b50356114f3565b6102ff61175f565b6102db611765565b6102ff611774565b6102ff600480360360208110156105ab57600080fd5b503561178d565b6102ff600480360360408110156105c857600080fd5b506001600160a01b038135811691602001351661179b565b6103b3600480360360808110156105f657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117c6565b6102ff611947565b6102ff61194c565b6040518060400160405280601381526020017211115611c8131a5c5d5a591a5d1e48141bdbdb606a1b81525081565b600061066f610668611952565b8484611956565b5060015b92915050565b6007546001600160a01b031681565b60065481565b60025490565b6003805460010190819055600754604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d602081101561071a57600080fd5b505110156107595760405162461bcd60e51b81526004018080602001828103825260308152602001806126296030913960400191505060405180910390fd5b610761611a42565b831161079e5760405162461bcd60e51b81526004018080602001828103825260248152602001806126e16024913960400191505060405180910390fd5b600086116107dd5760405162461bcd60e51b81526004018080602001828103825260278152602001806124a56027913960400191505060405180910390fd5b600a546005546008546001600160a01b039091169060009061080f90610809908b63ffffffff611a5316565b84611301565b9050868110156108505760405162461bcd60e51b815260040180806020018281038252602d8152602001806123e7602d913960400191505060405180910390fd5b600061087a670de0b6b3a764000061086e848d63ffffffff611aad16565b9063ffffffff611b0616565b604080516370a0823160e01b8152306004820152905191925082916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156108c557600080fd5b505afa1580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051101561092e5760405162461bcd60e51b81526004018080602001828103825260388152602001806125866038913960400191505060405180910390fd5b8881101561096d5760405162461bcd60e51b81526004018080602001828103825260288152602001806124cc6028913960400191505060405180910390fd5b600061097882611b48565b9050600061098c838363ffffffff611b6016565b905061099e868263ffffffff611b6016565b600a556109c96109bc8d6109b0611477565b9063ffffffff611a5316565b859063ffffffff611aad16565b6006556109d6338d611ba2565b6109e1853383611bdf565b60408051828152602081018e90528082018690529051339130917fa93b604be85dee08c402c756f5ca54b63c7fd292be0dd25ff4350debc9633fef9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50949350505050565b6007546001600160a01b031690565b6000610aa7848484611d49565b610b1d84610ab3611952565b610b188560405180606001604052806028815260200161253d602891396001600160a01b038a16600090815260016020526040812090610af1611952565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611ea516565b611956565b5060015b9392505050565b6005546001600160a01b031681565b60085490565b600380546001019081905581610b9a576040805162461bcd60e51b815260206004820152601860248201527f77697468647261773a20696e76616c696420746f6b656e730000000000000000604482015290519081900360640190fd5b6000610ba461068e565b11610bf6576040805162461bcd60e51b815260206004820181905260248201527f77697468647261773a20696e73756666696369656e74206c6971756964697479604482015290519081900360640190fd5b81610c0033611392565b1015610c53576040805162461bcd60e51b815260206004820152601d60248201527f77697468647261773a20696e73756666696369656e7420746f6b656e73000000604482015290519081900360640190fd5b6007546001600160a01b03166000610c6a84611360565b600554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610cbb57600080fd5b505afa158015610ccf573d6000803e3d6000fd5b505050506040513d6020811015610ce557600080fd5b505190506000610d06610cf661068e565b61086e848963ffffffff611aad16565b905081811115610d475760405162461bcd60e51b81526004018080602001828103825260228152602001806125e36022913960400191505060405180910390fd5b600854600a54610d5d828663ffffffff611b6016565b9150610d6f818463ffffffff611b6016565b90506000610d7d8383611301565b9050610da7610d9a87610d8e611477565b9063ffffffff611b6016565b829063ffffffff611aad16565b6006556008839055600a829055610dbf873388611bdf565b600554610dd6906001600160a01b03163386611bdf565b610de0338a611f3c565b6040805187815260208101839052815133926001600160a01b038b16927ff6a7e66150be6cb9298dfde86d270dad2bb6cf1550db4bc04fabc754e002e10c929081900390910190a350505050505050610e37611a42565b600b556003548114610e90576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b601281565b600654600090610eb790670de0b6b3a764000063ffffffff611b0616565b905090565b6003805460010190819055600554604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610f1857600080fd5b505afa158015610f2c573d6000803e3d6000fd5b505050506040513d6020811015610f4257600080fd5b50511015610f815760405162461bcd60e51b81526004018080602001828103825260368152602001806126596036913960400191505060405180910390fd5b610f89611a42565b8311610fc65760405162461bcd60e51b815260040180806020018281038252602a81526020018061239a602a913960400191505060405180910390fd5b600086116110055760405162461bcd60e51b815260040180806020018281038252602781526020018061247e6027913960400191505060405180910390fd5b600554600854600a546000926001600160a01b0316916110349161102f908b63ffffffff611a5316565b611301565b9150858211156110755760405162461bcd60e51b815260040180806020018281038252602d81526020018061268f602d913960400191505060405180910390fd5b60006110938361086e8b670de0b6b3a764000063ffffffff611aad16565b9050878110156110d45760405162461bcd60e51b81526004018080602001828103825260288152602001806124f46028913960400191505060405180910390fd5b60006110df8a611b48565b905060006110f38b8363ffffffff611b6016565b905060006111138661086e84670de0b6b3a764000063ffffffff611aad16565b600a54909150611129908363ffffffff611a5316565b600a5560085461114b90611143908363ffffffff611b6016565b600a54611301565b955061116961115c82610d8e611477565b879063ffffffff611aad16565b6006556111788533308f611f51565b6004805460408051630e14581960e21b815290516111ef9389936001600160a01b03169263385160649281830192602092829003018186803b1580156111bd57600080fd5b505afa1580156111d1573d6000803e3d6000fd5b505050506040513d60208110156111e757600080fd5b505185611bdf565b6111f933826120c4565b60408051828152602081018e90528082018890529051339130917f5e9c0189949f283ec504519f5615f4f190d66083cf363875683035cfbaac9a5a9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600061066f6112a7611952565b84610b1885600160006112b8611952565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611a5316565b60006112f982611392565b90505b919050565b6000610b218361086e84670de0b6b3a764000063ffffffff611aad16565b60008061132b83611392565b90508061133c5760009150506112fc565b610b218161086e670de0b6b3a764000061135461068e565b9063ffffffff611aad16565b600061136a61068e565b611376575060006112fc565b6112f961138161068e565b61086e84611354611477565b600381565b6001600160a01b031660009081526020819052604090205490565b604051806040016040528060078152602001660444558472d4c560cc1b81525081565b600854600a54600091610eb79161086e90670de0b6b3a764000063ffffffff611aad16565b600061066f611402611952565b84610b18856040518060600160405280602581526020016126bc602591396001600061142c611952565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611ea516565b600061066f611470611952565b8484611d49565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d60208110156114ec57600080fd5b5051905090565b600380546001019081905581611550576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a20696e76616c696420616d6f756e74000000000000000000604482015290519081900360640190fd5b600061155a611477565b6007546008549192506001600160a01b031690600090611580908663ffffffff611a5316565b600a5490915060006115928383611301565b905060006115a6828963ffffffff611aad16565b9050600081116115fd576040805162461bcd60e51b815260206004820152601f60248201527f6465706f7369743a20696e76616c69642075736572206c697175696469747900604482015290519081900360640190fd5b61160d868963ffffffff611a5316565b9550600061162682600654611a5390919063ffffffff16565b905060006116358289856120f1565b905060006116d1611648836109b061068e565b600554604080516370a0823160e01b8152306004820152905161086e9287926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561169957600080fd5b505afa1580156116ad573d6000803e3d6000fd5b505050506040513d60208110156116c357600080fd5b50519063ffffffff611aad16565b600888905590506116e8868263ffffffff611a5316565b600a5560068390556116fa338361211c565b6117068833308e611f51565b604080518c815260208101879052815133926001600160a01b038c16927f4466433a9d9e9d68780a1f6286a07c1c7a0e597fe1af747b4ea79d013628fc9e929081900390910190a3505050505050505050610e37611a42565b600b5490565b6004546001600160a01b031681565b600954600a54600091610eb7919063ffffffff611aad16565b60006112f9826113546113d0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6004546001600160a01b0316331461181d576040805162461bcd60e51b815260206004820152601560248201527434b734ba34b0b634bd329d102337b93134b23232b760591b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038681169190911791829055604080516318160ddd60e01b8152905192909116916318160ddd91600480820192602092909190829003018186803b15801561187957600080fd5b505afa15801561188d573d6000803e3d6000fd5b505050506040513d60208110156118a357600080fd5b50518211156118f9576040805162461bcd60e51b815260206004820152601760248201527f696e697469616c697a653a20496e76616c6964205f4374000000000000000000604482015290519081900360640190fd5b6008829055600981905561191f670de0b6b3a764000061086e838563ffffffff611aad16565b600a555050600580546001600160a01b0319166001600160a01b039290921691909117905550565b606481565b600a5490565b3390565b6001600160a01b03831661199b5760405162461bcd60e51b81526004018080602001828103825260248152602001806126056024913960400191505060405180910390fd5b6001600160a01b0382166119e05760405162461bcd60e51b81526004018080602001828103825260228152602001806124366022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610eb742600860030154612131565b600082820183811015610b21576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611abc57506000610673565b82820282848281611ac957fe5b0414610b215760405162461bcd60e51b815260040180806020018281038252602181526020018061251c6021913960400191505060405180910390fd5b6000610b2183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612148565b60006112f9606461086e84600363ffffffff611aad16565b6000610b2183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ea5565b600854611bb5908263ffffffff611a5316565b600855600754611bd0906001600160a01b0316833084611f51565b611bd8611a42565b600b555050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310611c5c5780518252601f199092019160209182019101611c3d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611cbe576040519150601f19603f3d011682016040523d82523d6000602084013e611cc3565b606091505b5091509150818015611cf1575080511580611cf15750808060200190516020811015611cee57600080fd5b50515b611d42576040805162461bcd60e51b815260206004820152601960248201527f5f746f6b656e536166655472616e73666572206661696c656400000000000000604482015290519081900360640190fd5b5050505050565b6001600160a01b038316611d8e5760405162461bcd60e51b81526004018080602001828103825260258152602001806125be6025913960400191505060405180910390fd5b6001600160a01b038216611dd35760405162461bcd60e51b81526004018080602001828103825260238152602001806123c46023913960400191505060405180910390fd5b611e1681604051806060016040528060268152602001612458602691396001600160a01b038616600090815260208190526040902054919063ffffffff611ea516565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611e4b908263ffffffff611a5316565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611f345760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ef9578181015183820152602001611ee1565b50505050905090810190601f168015611f265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611f47823083611d49565b610e9030826121ad565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611fd65780518252601f199092019160209182019101611fb7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612038576040519150601f19603f3d011682016040523d82523d6000602084013e61203d565b606091505b509150915081801561206b57508051158061206b575080806020019051602081101561206857600080fd5b50515b6120bc576040805162461bcd60e51b815260206004820152601d60248201527f5f746f6b656e536166655472616e7366657246726f6d206661696c6564000000604482015290519081900360640190fd5b505050505050565b6008546120d7908263ffffffff611b6016565b600855600754611bd0906001600160a01b03168383611bdf565b60008361210057506000610b21565b6121148461086e858563ffffffff611aad16565b949350505050565b61212630826122a9565b610e90308383611d49565b6000818310156121415781610b21565b5090919050565b600081836121975760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ef9578181015183820152602001611ee1565b5060008385816121a357fe5b0495945050505050565b6001600160a01b0382166121f25760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b61223581604051806060016040528060228152602001612414602291396001600160a01b038516600090815260208190526040902054919063ffffffff611ea516565b6001600160a01b038316600090815260208190526040902055600254612261908263ffffffff611b6016565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216612304576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612317908263ffffffff611a5316565b6002556001600160a01b038216600090815260208190526040902054612343908263ffffffff611a5316565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe737761704578616374455448466f72546f6b656e733a20496e76616c6964207472616e73616374696f6e45524332303a207472616e7366657220746f20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e76616c696420707269636520736c69707061676545524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e744f7574737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e744f7574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420636f6c6c61746572616c206c697175696469747945524332303a207472616e736665722066726f6d20746865207a65726f206164647265737377697468647261773a20696e73756666696369656e74204554482062616c616e636545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420757365722062616c616e6365737761704578616374455448466f72546f6b656e733a20496e73756666696369656e7420636f6c6c61746572616c2062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420707269636520736c69707061676545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f737761704578616374546f6b656e73466f724554483a20496e76616c6964206f72646572a265627a7a72315820e60b5c0b1deef7ab66eab4a0009e41ac5f8aa414488887bb722f3ba47eee133b64736f6c63430005110032a265627a7a72315820bd01ccd67dfdd9e4db0d9219bd6b2192d8304a88916bdd8d0d38a03d4161251564736f6c63430005110032000000000000000000000000b81d70802a816b5dacba06d708b5acf19dcd436d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063ae2e933b1161005b578063ae2e933b146100fe578063b039ddf614610106578063d88ff1f414610138578063d8dfeb451461019057610088565b806319db22281461008d57806338516064146100b55780638da5cb5b146100d9578063ad6048d8146100e1575b600080fd5b6100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610198565b005b6100bd610211565b604080516001600160a01b039092168252519081900360200190f35b6100bd610220565b6100bd600480360360208110156100f757600080fd5b503561022f565b6100bd610256565b6100bd6004803603606081101561011c57600080fd5b506001600160a01b038135169060208101359060400135610265565b610140610550565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561017c578181015183820152602001610164565b505050509050019250505060405180910390f35b6100bd6105b2565b6000546001600160a01b031633146101ef576040805162461bcd60e51b815260206004820152601560248201527439b2ba2332b2a837b7b61d102337b93134b23232b760591b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031690565b6000546001600160a01b031681565b6004818154811061023c57fe5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b031681565b60006001600160a01b0384166102c2576040805162461bcd60e51b815260206004820152601860248201527f637265617465506f6f6c3a207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6001546001600160a01b031661031f576040805162461bcd60e51b815260206004820152601b60248201527f637265617465506f6f6c3a20666565506f6f6c206e6f74207365740000000000604482015290519081900360640190fd5b6001600160a01b0384811660009081526003602090815260408083203384529091529020541615610397576040805162461bcd60e51b815260206004820152601c60248201527f637265617465506f6f6c3a207573657220706f6f6c2065786973747300000000604482015290519081900360640190fd5b6060604051806020016103a9906105c1565b601f1982820381018352601f9091011660408181526002546bffffffffffffffffffffffff1960608a811b821660208681019190915292811b909116603485015233901b60488401528151603c818503018152605c909301909152815191810191909120825192935091829184016000f56002546040805163eb990c5960e01b81526001600160a01b038a811660048301529283166024820152604481018990526064810188905290519295509085169163eb990c599160848082019260009290919082900301818387803b15801561048157600080fd5b505af1158015610495573d6000803e3d6000fd5b5050506001600160a01b038088166000818152600360209081526040808320338085529083528184208054968b166001600160a01b0319978816811790915560048054600181018255958190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909501805490971681179096559254815190815290519295507febbbe9dc3a19d2f959ac76ac0372b4983cdfb945f5d6aef4873c36fabb2ba8aa929081900390910190a450509392505050565b606060048054806020026020016040519081016040528092919081815260200182805480156105a857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161058a575b5050505050905090565b6002546001600160a01b031681565b61277a806105cf8339019056fe608060405234801561001057600080fd5b506001600355600480546001600160a01b031916331790556000600b819055600655612739806100416000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80634dfe0b1b11610125578063b6b55f25116100ad578063cc3644f11161007c578063cc3644f114610595578063dd62ed3e146105b2578063eb990c59146105e0578063ecefc7051461061c578063fd5c63b21461062457610211565b8063b6b55f2514610560578063b7f883201461057d578063c45a015514610585578063cbf950bd1461058d57610211565b806395d89b41116100f457806395d89b41146104f057806398d5fdca146104f8578063a457c2d714610500578063a9059cbb1461052c578063abd70aa21461055857610211565b80634dfe0b1b1461047f5780635556350d146104a55780635afbc4a8146104c257806370a08231146104ca57610211565b806324bbab8b116101a857806335c7e9251161017757806335c7e925146103d3578063376c4642146103db578063395093511461040a5780633c4750df146104365780633f8128821461045c57610211565b806324bbab8b146103865780632b112e491461038e5780632e1a7d4d14610396578063313ce567146103b557610211565b806318160ddd116101e457806318160ddd146103115780631d98cf401461031957806321df0da71461034857806323b872dd1461035057610211565b806306fdde0314610216578063095ea7b3146102935780630dfe1681146102d357806315770f92146102f7575b600080fd5b61021e61062c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf600480360360408110156102a957600080fd5b506001600160a01b03813516906020013561065b565b604080519115158252519081900360200190f35b6102db610679565b604080516001600160a01b039092168252519081900360200190f35b6102ff610688565b60408051918252519081900360200190f35b6102ff61068e565b6102ff6004803603608081101561032f57600080fd5b5080359060208101359060408101359060600135610694565b6102db610a8b565b6102bf6004803603606081101561036657600080fd5b506001600160a01b03813581169160208101359091169060400135610a9a565b6102db610b28565b6102ff610b37565b6103b3600480360360208110156103ac57600080fd5b5035610b3d565b005b6103bd610e94565b6040805160ff9092168252519081900360200190f35b6102ff610e99565b6102ff600480360360808110156103f157600080fd5b5080359060208101359060408101359060600135610ebc565b6102bf6004803603604081101561042057600080fd5b506001600160a01b03813516906020013561129a565b6102ff6004803603602081101561044c57600080fd5b50356001600160a01b03166112ee565b6102ff6004803603604081101561047257600080fd5b5080359060200135611301565b6102ff6004803603602081101561049557600080fd5b50356001600160a01b031661131f565b6102ff600480360360208110156104bb57600080fd5b5035611360565b6102ff61138d565b6102ff600480360360208110156104e057600080fd5b50356001600160a01b0316611392565b61021e6113ad565b6102ff6113d0565b6102bf6004803603604081101561051657600080fd5b506001600160a01b0381351690602001356113f5565b6102bf6004803603604081101561054257600080fd5b506001600160a01b038135169060200135611463565b6102ff611477565b6103b36004803603602081101561057657600080fd5b50356114f3565b6102ff61175f565b6102db611765565b6102ff611774565b6102ff600480360360208110156105ab57600080fd5b503561178d565b6102ff600480360360408110156105c857600080fd5b506001600160a01b038135811691602001351661179b565b6103b3600480360360808110156105f657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117c6565b6102ff611947565b6102ff61194c565b6040518060400160405280601381526020017211115611c8131a5c5d5a591a5d1e48141bdbdb606a1b81525081565b600061066f610668611952565b8484611956565b5060015b92915050565b6007546001600160a01b031681565b60065481565b60025490565b6003805460010190819055600754604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d602081101561071a57600080fd5b505110156107595760405162461bcd60e51b81526004018080602001828103825260308152602001806126296030913960400191505060405180910390fd5b610761611a42565b831161079e5760405162461bcd60e51b81526004018080602001828103825260248152602001806126e16024913960400191505060405180910390fd5b600086116107dd5760405162461bcd60e51b81526004018080602001828103825260278152602001806124a56027913960400191505060405180910390fd5b600a546005546008546001600160a01b039091169060009061080f90610809908b63ffffffff611a5316565b84611301565b9050868110156108505760405162461bcd60e51b815260040180806020018281038252602d8152602001806123e7602d913960400191505060405180910390fd5b600061087a670de0b6b3a764000061086e848d63ffffffff611aad16565b9063ffffffff611b0616565b604080516370a0823160e01b8152306004820152905191925082916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156108c557600080fd5b505afa1580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051101561092e5760405162461bcd60e51b81526004018080602001828103825260388152602001806125866038913960400191505060405180910390fd5b8881101561096d5760405162461bcd60e51b81526004018080602001828103825260288152602001806124cc6028913960400191505060405180910390fd5b600061097882611b48565b9050600061098c838363ffffffff611b6016565b905061099e868263ffffffff611b6016565b600a556109c96109bc8d6109b0611477565b9063ffffffff611a5316565b859063ffffffff611aad16565b6006556109d6338d611ba2565b6109e1853383611bdf565b60408051828152602081018e90528082018690529051339130917fa93b604be85dee08c402c756f5ca54b63c7fd292be0dd25ff4350debc9633fef9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50949350505050565b6007546001600160a01b031690565b6000610aa7848484611d49565b610b1d84610ab3611952565b610b188560405180606001604052806028815260200161253d602891396001600160a01b038a16600090815260016020526040812090610af1611952565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611ea516565b611956565b5060015b9392505050565b6005546001600160a01b031681565b60085490565b600380546001019081905581610b9a576040805162461bcd60e51b815260206004820152601860248201527f77697468647261773a20696e76616c696420746f6b656e730000000000000000604482015290519081900360640190fd5b6000610ba461068e565b11610bf6576040805162461bcd60e51b815260206004820181905260248201527f77697468647261773a20696e73756666696369656e74206c6971756964697479604482015290519081900360640190fd5b81610c0033611392565b1015610c53576040805162461bcd60e51b815260206004820152601d60248201527f77697468647261773a20696e73756666696369656e7420746f6b656e73000000604482015290519081900360640190fd5b6007546001600160a01b03166000610c6a84611360565b600554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610cbb57600080fd5b505afa158015610ccf573d6000803e3d6000fd5b505050506040513d6020811015610ce557600080fd5b505190506000610d06610cf661068e565b61086e848963ffffffff611aad16565b905081811115610d475760405162461bcd60e51b81526004018080602001828103825260228152602001806125e36022913960400191505060405180910390fd5b600854600a54610d5d828663ffffffff611b6016565b9150610d6f818463ffffffff611b6016565b90506000610d7d8383611301565b9050610da7610d9a87610d8e611477565b9063ffffffff611b6016565b829063ffffffff611aad16565b6006556008839055600a829055610dbf873388611bdf565b600554610dd6906001600160a01b03163386611bdf565b610de0338a611f3c565b6040805187815260208101839052815133926001600160a01b038b16927ff6a7e66150be6cb9298dfde86d270dad2bb6cf1550db4bc04fabc754e002e10c929081900390910190a350505050505050610e37611a42565b600b556003548114610e90576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b601281565b600654600090610eb790670de0b6b3a764000063ffffffff611b0616565b905090565b6003805460010190819055600554604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610f1857600080fd5b505afa158015610f2c573d6000803e3d6000fd5b505050506040513d6020811015610f4257600080fd5b50511015610f815760405162461bcd60e51b81526004018080602001828103825260368152602001806126596036913960400191505060405180910390fd5b610f89611a42565b8311610fc65760405162461bcd60e51b815260040180806020018281038252602a81526020018061239a602a913960400191505060405180910390fd5b600086116110055760405162461bcd60e51b815260040180806020018281038252602781526020018061247e6027913960400191505060405180910390fd5b600554600854600a546000926001600160a01b0316916110349161102f908b63ffffffff611a5316565b611301565b9150858211156110755760405162461bcd60e51b815260040180806020018281038252602d81526020018061268f602d913960400191505060405180910390fd5b60006110938361086e8b670de0b6b3a764000063ffffffff611aad16565b9050878110156110d45760405162461bcd60e51b81526004018080602001828103825260288152602001806124f46028913960400191505060405180910390fd5b60006110df8a611b48565b905060006110f38b8363ffffffff611b6016565b905060006111138661086e84670de0b6b3a764000063ffffffff611aad16565b600a54909150611129908363ffffffff611a5316565b600a5560085461114b90611143908363ffffffff611b6016565b600a54611301565b955061116961115c82610d8e611477565b879063ffffffff611aad16565b6006556111788533308f611f51565b6004805460408051630e14581960e21b815290516111ef9389936001600160a01b03169263385160649281830192602092829003018186803b1580156111bd57600080fd5b505afa1580156111d1573d6000803e3d6000fd5b505050506040513d60208110156111e757600080fd5b505185611bdf565b6111f933826120c4565b60408051828152602081018e90528082018890529051339130917f5e9c0189949f283ec504519f5615f4f190d66083cf363875683035cfbaac9a5a9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600061066f6112a7611952565b84610b1885600160006112b8611952565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611a5316565b60006112f982611392565b90505b919050565b6000610b218361086e84670de0b6b3a764000063ffffffff611aad16565b60008061132b83611392565b90508061133c5760009150506112fc565b610b218161086e670de0b6b3a764000061135461068e565b9063ffffffff611aad16565b600061136a61068e565b611376575060006112fc565b6112f961138161068e565b61086e84611354611477565b600381565b6001600160a01b031660009081526020819052604090205490565b604051806040016040528060078152602001660444558472d4c560cc1b81525081565b600854600a54600091610eb79161086e90670de0b6b3a764000063ffffffff611aad16565b600061066f611402611952565b84610b18856040518060600160405280602581526020016126bc602591396001600061142c611952565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611ea516565b600061066f611470611952565b8484611d49565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d60208110156114ec57600080fd5b5051905090565b600380546001019081905581611550576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a20696e76616c696420616d6f756e74000000000000000000604482015290519081900360640190fd5b600061155a611477565b6007546008549192506001600160a01b031690600090611580908663ffffffff611a5316565b600a5490915060006115928383611301565b905060006115a6828963ffffffff611aad16565b9050600081116115fd576040805162461bcd60e51b815260206004820152601f60248201527f6465706f7369743a20696e76616c69642075736572206c697175696469747900604482015290519081900360640190fd5b61160d868963ffffffff611a5316565b9550600061162682600654611a5390919063ffffffff16565b905060006116358289856120f1565b905060006116d1611648836109b061068e565b600554604080516370a0823160e01b8152306004820152905161086e9287926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561169957600080fd5b505afa1580156116ad573d6000803e3d6000fd5b505050506040513d60208110156116c357600080fd5b50519063ffffffff611aad16565b600888905590506116e8868263ffffffff611a5316565b600a5560068390556116fa338361211c565b6117068833308e611f51565b604080518c815260208101879052815133926001600160a01b038c16927f4466433a9d9e9d68780a1f6286a07c1c7a0e597fe1af747b4ea79d013628fc9e929081900390910190a3505050505050505050610e37611a42565b600b5490565b6004546001600160a01b031681565b600954600a54600091610eb7919063ffffffff611aad16565b60006112f9826113546113d0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6004546001600160a01b0316331461181d576040805162461bcd60e51b815260206004820152601560248201527434b734ba34b0b634bd329d102337b93134b23232b760591b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038681169190911791829055604080516318160ddd60e01b8152905192909116916318160ddd91600480820192602092909190829003018186803b15801561187957600080fd5b505afa15801561188d573d6000803e3d6000fd5b505050506040513d60208110156118a357600080fd5b50518211156118f9576040805162461bcd60e51b815260206004820152601760248201527f696e697469616c697a653a20496e76616c6964205f4374000000000000000000604482015290519081900360640190fd5b6008829055600981905561191f670de0b6b3a764000061086e838563ffffffff611aad16565b600a555050600580546001600160a01b0319166001600160a01b039290921691909117905550565b606481565b600a5490565b3390565b6001600160a01b03831661199b5760405162461bcd60e51b81526004018080602001828103825260248152602001806126056024913960400191505060405180910390fd5b6001600160a01b0382166119e05760405162461bcd60e51b81526004018080602001828103825260228152602001806124366022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610eb742600860030154612131565b600082820183811015610b21576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611abc57506000610673565b82820282848281611ac957fe5b0414610b215760405162461bcd60e51b815260040180806020018281038252602181526020018061251c6021913960400191505060405180910390fd5b6000610b2183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612148565b60006112f9606461086e84600363ffffffff611aad16565b6000610b2183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ea5565b600854611bb5908263ffffffff611a5316565b600855600754611bd0906001600160a01b0316833084611f51565b611bd8611a42565b600b555050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310611c5c5780518252601f199092019160209182019101611c3d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611cbe576040519150601f19603f3d011682016040523d82523d6000602084013e611cc3565b606091505b5091509150818015611cf1575080511580611cf15750808060200190516020811015611cee57600080fd5b50515b611d42576040805162461bcd60e51b815260206004820152601960248201527f5f746f6b656e536166655472616e73666572206661696c656400000000000000604482015290519081900360640190fd5b5050505050565b6001600160a01b038316611d8e5760405162461bcd60e51b81526004018080602001828103825260258152602001806125be6025913960400191505060405180910390fd5b6001600160a01b038216611dd35760405162461bcd60e51b81526004018080602001828103825260238152602001806123c46023913960400191505060405180910390fd5b611e1681604051806060016040528060268152602001612458602691396001600160a01b038616600090815260208190526040902054919063ffffffff611ea516565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611e4b908263ffffffff611a5316565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611f345760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ef9578181015183820152602001611ee1565b50505050905090810190601f168015611f265780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611f47823083611d49565b610e9030826121ad565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611fd65780518252601f199092019160209182019101611fb7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612038576040519150601f19603f3d011682016040523d82523d6000602084013e61203d565b606091505b509150915081801561206b57508051158061206b575080806020019051602081101561206857600080fd5b50515b6120bc576040805162461bcd60e51b815260206004820152601d60248201527f5f746f6b656e536166655472616e7366657246726f6d206661696c6564000000604482015290519081900360640190fd5b505050505050565b6008546120d7908263ffffffff611b6016565b600855600754611bd0906001600160a01b03168383611bdf565b60008361210057506000610b21565b6121148461086e858563ffffffff611aad16565b949350505050565b61212630826122a9565b610e90308383611d49565b6000818310156121415781610b21565b5090919050565b600081836121975760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ef9578181015183820152602001611ee1565b5060008385816121a357fe5b0495945050505050565b6001600160a01b0382166121f25760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b61223581604051806060016040528060228152602001612414602291396001600160a01b038516600090815260208190526040902054919063ffffffff611ea516565b6001600160a01b038316600090815260208190526040902055600254612261908263ffffffff611b6016565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216612304576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612317908263ffffffff611a5316565b6002556001600160a01b038216600090815260208190526040902054612343908263ffffffff611a5316565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe737761704578616374455448466f72546f6b656e733a20496e76616c6964207472616e73616374696f6e45524332303a207472616e7366657220746f20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e76616c696420707269636520736c69707061676545524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e744f7574737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e744f7574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420636f6c6c61746572616c206c697175696469747945524332303a207472616e736665722066726f6d20746865207a65726f206164647265737377697468647261773a20696e73756666696369656e74204554482062616c616e636545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420757365722062616c616e6365737761704578616374455448466f72546f6b656e733a20496e73756666696369656e7420636f6c6c61746572616c2062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420707269636520736c69707061676545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f737761704578616374546f6b656e73466f724554483a20496e76616c6964206f72646572a265627a7a72315820e60b5c0b1deef7ab66eab4a0009e41ac5f8aa414488887bb722f3ba47eee133b64736f6c63430005110032a265627a7a72315820bd01ccd67dfdd9e4db0d9219bd6b2192d8304a88916bdd8d0d38a03d4161251564736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b81d70802a816b5dacba06d708b5acf19dcd436d

-----Decoded View---------------
Arg [0] : token1 (address): 0xB81D70802a816B5DacBA06D708B5acF19DcD436D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b81d70802a816b5dacba06d708b5acf19dcd436d


Deployed Bytecode Sourcemap

158:1763:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;158:1763:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1661:145;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1661:145:2;-1:-1:-1;;;;;1661:145:2;;:::i;:::-;;1570:85;;;:::i;:::-;;;;-1:-1:-1;;;;;1570:85:2;;;;;;;;;;;;;;330:20;;;:::i;487:33::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;487:33:2;;:::i;356:22::-;;;:::i;662:902::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;662:902:2;;;;;;;;;;;;;:::i;1812:104::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1812:104:2;;;;;;;;;;;;;;;;;384:25;;;:::i;1661:145::-;1740:5;;-1:-1:-1;;;;;1740:5:2;1726:10;:19;1718:53;;;;;-1:-1:-1;;;1718:53:2;;;;;;;;;;;;-1:-1:-1;;;1718:53:2;;;;;;;;;;;;;;;1781:7;:18;;-1:-1:-1;;;;;;1781:18:2;-1:-1:-1;;;;;1781:18:2;;;;;;;;;;1661:145::o;1570:85::-;1641:7;;-1:-1:-1;;;;;1641:7:2;1570:85;:::o;330:20::-;;;-1:-1:-1;;;;;330:20:2;;:::o;487:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;487:33:2;;-1:-1:-1;487:33:2;:::o;356:22::-;;;-1:-1:-1;;;;;356:22:2;;:::o;662:902::-;734:12;-1:-1:-1;;;;;766:20:2;;758:57;;;;;-1:-1:-1;;;758:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:7;;-1:-1:-1;;;;;833:7:2;825:61;;;;;-1:-1:-1;;;825:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;904:17:2;;;945:1;904:17;;;:9;:17;;;;;;;;922:10;904:29;;;;;;;;;:43;896:84;;;;;-1:-1:-1;;;896:84:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:21;1014:41;;;;;;;;:::i;:::-;-1:-1:-1;;21:26;;;;;7:41;;87:2;69:12;;;65:26;61:2;54:38;;;1115:10:2;;-1:-1:-1;;1090:48:2;;;;;;41:4:-1;1090:48:2;;;;;;;;;;;;;;;;;1127:10;1090:48;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1090:48:2;;;;;;;1080:59;;;;;;;;;1279:15;;34:5:-1;;-1:-1;1080:59:2;;;30:16:-1;;1065:12:2;1249:52;1359:10;;1320:58;;;-1:-1:-1;;;1320:58:2;;-1:-1:-1;;;;;1320:58:2;;;;;;;1359:10;;;1320:58;;;;;;;;;;;;;;;;;;1241:60;;-1:-1:-1;1320:30:2;;;;;;:58;;;;;1359:10;;1320:58;;;;;;;;1359:10;1320:30;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;1320:58:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;1388:17:2;;;;;;;:9;:17;;;;;;;;1406:10;1388:29;;;;;;;;;:36;;;;;-1:-1:-1;;;;;;1388:36:2;;;;;;;;1434:15;27:10:-1;;1388:36:2;23:18:-1;;45:23;;1434:26:2;;;;;;;;;;;;;;;;;;1513:22;;1475:61;;;;;;;1406:10;;-1:-1:-1;1475:61:2;;;;;;;;;;;-1:-1:-1;;662:902:2;;;;;:::o;1812:104::-;1858:17;1894:15;1887:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1887:22:2;;;;;;;;;;;;;;;;;;;;;;;1812:104;:::o;384:25::-;;;-1:-1:-1;;;;;384:25:2;;:::o;158:1763::-;;;;;;;;:::o

Swarm Source

bzzr://bd01ccd67dfdd9e4db0d9219bd6b2192d8304a88916bdd8d0d38a03d41612515

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  ]

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.