Token DEXG Liquidity Pool

 

Overview [ERC-20]

Max Total Supply:
2,418.747738798408446559 DEXG-LP

Holders:
67

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DextokenPool

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 3 of 16: DextokenPool.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 DextokenPool is LPToken, IDextokenPool, ReentrancyGuard {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    /// AMM fee
    uint public constant FEE_BASE      = 10**4; // 0.01%
    uint public constant FEE_FACTOR    = 30;

    IDextokenFactory public factory;

    /// The collateral token
    IERC20 public WETH;

    /// 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
        WETH = 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 = WETH.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 = WETH.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(WETH), 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(WETH.balanceOf(msg.sender) >= amountIn, "swapExactETHForTokens: Insufficient ETH balance");
        require(deadline > _lastPriceTickApplicable(), "swapExactETHForTokens: Invalid transaction");
        require(amountIn > 0, "swapExactETHForTokens: Invalid amountIn");
        uint spotPrice;
        IERC20 _WETH = WETH;

        /// 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(_WETH), msg.sender, address(this), amountIn);
        
        /// transfer fees
        _tokenSafeTransfer(address(_WETH), 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 _WETH = WETH;

        /// 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(_WETH.balanceOf(address(this)) >= amountOut, "swapExactTokensForETH: Insufficient ETH 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(_WETH), 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 1 of 16: 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 2 of 16: Context.sol
pragma solidity 0.5.17;


contract Context {
    constructor () internal { }

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

File 4 of 16: 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 5 of 16: 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 6 of 16: IDextokenFactory.sol
pragma solidity 0.5.17;


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

File 7 of 16: 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 8 of 16: 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 9 of 16: 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 10 of 16: 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 11 of 16: 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 12 of 16: 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 13 of 16: 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 14 of 16: 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 15 of 16: 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 16 of 16: 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":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spotPrice","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SwapExactETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spotPrice","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SwapExactTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spotPrice","type":"uint256"}],"name":"TokenDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spotPrice","type":"uint256"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"FEE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FEE_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"contract IDextokenFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_Ct","type":"uint256"},{"internalType":"uint256","name":"_Nt","type":"uint256"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getUserbase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_Ct","type":"uint256"},{"internalType":"uint256","name":"_Pt","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidityFromAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"liquidityOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"liquiditySharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"liquidityTokenToAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mean","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506001600355600480546001600160a01b031916331790556000600b81905560065561272d806100416000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80635556350d11610125578063b6b55f25116100ad578063cc3644f11161007c578063cc3644f114610595578063dd62ed3e146105b2578063eb990c59146105e0578063ecefc7051461061c578063fd5c63b21461062457610211565b8063b6b55f2514610560578063b7f883201461057d578063c45a015514610585578063cbf950bd1461058d57610211565b806398d5fdca116100f457806398d5fdca146104f0578063a457c2d7146104f8578063a9059cbb14610524578063abd70aa214610550578063ad5c46481461055857610211565b80635556350d1461049d5780635afbc4a8146104ba57806370a08231146104c257806395d89b41146104e857610211565b80632b112e49116101a8578063376c464211610177578063376c4642146103d357806339509351146104025780633c4750df1461042e5780633f812882146104545780634dfe0b1b1461047757610211565b80632b112e49146103865780632e1a7d4d1461038e578063313ce567146103ad57806335c7e925146103cb57610211565b806318160ddd116101e457806318160ddd146103115780631d98cf401461031957806321df0da71461034857806323b872dd1461035057610211565b806306fdde0314610216578063095ea7b3146102935780630dfe1681146102d357806315770f92146102f7575b600080fd5b61021e61062c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102bf600480360360408110156102a957600080fd5b506001600160a01b03813516906020013561065b565b604080519115158252519081900360200190f35b6102db610679565b604080516001600160a01b039092168252519081900360200190f35b6102ff610688565b60408051918252519081900360200190f35b6102ff61068e565b6102ff6004803603608081101561032f57600080fd5b5080359060208101359060408101359060600135610694565b6102db610a8b565b6102bf6004803603606081101561036657600080fd5b506001600160a01b03813581169160208101359091169060400135610a9a565b6102ff610b28565b6103ab600480360360208110156103a457600080fd5b5035610b2e565b005b6103b5610e85565b6040805160ff9092168252519081900360200190f35b6102ff610e8a565b6102ff600480360360808110156103e957600080fd5b5080359060208101359060408101359060600135610ead565b6102bf6004803603604081101561041857600080fd5b506001600160a01b03813516906020013561128b565b6102ff6004803603602081101561044457600080fd5b50356001600160a01b03166112df565b6102ff6004803603604081101561046a57600080fd5b50803590602001356112f2565b6102ff6004803603602081101561048d57600080fd5b50356001600160a01b0316611310565b6102ff600480360360208110156104b357600080fd5b5035611351565b6102ff61137e565b6102ff600480360360208110156104d857600080fd5b50356001600160a01b0316611383565b61021e61139e565b6102ff6113c1565b6102bf6004803603604081101561050e57600080fd5b506001600160a01b0381351690602001356113e6565b6102bf6004803603604081101561053a57600080fd5b506001600160a01b038135169060200135611454565b6102ff611468565b6102db6114e4565b6103ab6004803603602081101561057657600080fd5b50356114f3565b6102ff61175f565b6102db611765565b6102ff611774565b6102ff600480360360208110156105ab57600080fd5b503561178d565b6102ff600480360360408110156105c857600080fd5b506001600160a01b038135811691602001351661179b565b6103ab600480360360808110156105f657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117c6565b6102ff611947565b6102ff61194d565b6040518060400160405280601381526020017211115611c8131a5c5d5a591a5d1e48141bdbdb606a1b81525081565b600061066f610668611953565b8484611957565b5060015b92915050565b6007546001600160a01b031681565b60065481565b60025490565b6003805460010190819055600754604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d602081101561071a57600080fd5b505110156107595760405162461bcd60e51b81526004018080602001828103825260308152602001806126536030913960400191505060405180910390fd5b610761611a43565b831161079e5760405162461bcd60e51b81526004018080602001828103825260248152602001806126d56024913960400191505060405180910390fd5b600086116107dd5760405162461bcd60e51b81526004018080602001828103825260278152602001806124a76027913960400191505060405180910390fd5b600a546005546008546001600160a01b039091169060009061080f90610809908b63ffffffff611a5416565b846112f2565b9050868110156108505760405162461bcd60e51b815260040180806020018281038252602d8152602001806123e9602d913960400191505060405180910390fd5b600061087a670de0b6b3a764000061086e848d63ffffffff611aae16565b9063ffffffff611b0716565b604080516370a0823160e01b8152306004820152905191925082916001600160a01b038616916370a08231916024808301926020929190829003018186803b1580156108c557600080fd5b505afa1580156108d9573d6000803e3d6000fd5b505050506040513d60208110156108ef57600080fd5b5051101561092e5760405162461bcd60e51b81526004018080602001828103825260318152602001806124f66031913960400191505060405180910390fd5b8881101561096d5760405162461bcd60e51b81526004018080602001828103825260288152602001806124ce6028913960400191505060405180910390fd5b600061097882611b49565b9050600061098c838363ffffffff611b6216565b905061099e868263ffffffff611b6216565b600a556109c96109bc8d6109b0611468565b9063ffffffff611a5416565b859063ffffffff611aae16565b6006556109d6338d611ba4565b6109e1853383611be1565b60408051828152602081018e90528082018690529051339130917fa93b604be85dee08c402c756f5ca54b63c7fd292be0dd25ff4350debc9633fef9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50949350505050565b6007546001600160a01b031690565b6000610aa7848484611d4b565b610b1d84610ab3611953565b610b1885604051806060016040528060288152602001612570602891396001600160a01b038a16600090815260016020526040812090610af1611953565b6001600160a01b03168152602081019190915260400160002054919063ffffffff611ea716565b611957565b5060015b9392505050565b60085490565b600380546001019081905581610b8b576040805162461bcd60e51b815260206004820152601860248201527f77697468647261773a20696e76616c696420746f6b656e730000000000000000604482015290519081900360640190fd5b6000610b9561068e565b11610be7576040805162461bcd60e51b815260206004820181905260248201527f77697468647261773a20696e73756666696369656e74206c6971756964697479604482015290519081900360640190fd5b81610bf133611383565b1015610c44576040805162461bcd60e51b815260206004820152601d60248201527f77697468647261773a20696e73756666696369656e7420746f6b656e73000000604482015290519081900360640190fd5b6007546001600160a01b03166000610c5b84611351565b600554604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610cac57600080fd5b505afa158015610cc0573d6000803e3d6000fd5b505050506040513d6020811015610cd657600080fd5b505190506000610cf7610ce761068e565b61086e848963ffffffff611aae16565b905081811115610d385760405162461bcd60e51b81526004018080602001828103825260228152602001806125de6022913960400191505060405180910390fd5b600854600a54610d4e828663ffffffff611b6216565b9150610d60818463ffffffff611b6216565b90506000610d6e83836112f2565b9050610d98610d8b87610d7f611468565b9063ffffffff611b6216565b829063ffffffff611aae16565b6006556008839055600a829055610db0873388611be1565b600554610dc7906001600160a01b03163386611be1565b610dd1338a611f3e565b6040805187815260208101839052815133926001600160a01b038b16927ff6a7e66150be6cb9298dfde86d270dad2bb6cf1550db4bc04fabc754e002e10c929081900390910190a350505050505050610e28611a43565b600b556003548114610e81576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b601281565b600654600090610ea890670de0b6b3a764000063ffffffff611b0716565b905090565b6003805460010190819055600554604080516370a0823160e01b815233600482015290516000939288926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610f0957600080fd5b505afa158015610f1d573d6000803e3d6000fd5b505050506040513d6020811015610f3357600080fd5b50511015610f725760405162461bcd60e51b815260040180806020018281038252602f815260200180612624602f913960400191505060405180910390fd5b610f7a611a43565b8311610fb75760405162461bcd60e51b815260040180806020018281038252602a81526020018061239c602a913960400191505060405180910390fd5b60008611610ff65760405162461bcd60e51b81526004018080602001828103825260278152602001806124806027913960400191505060405180910390fd5b600554600854600a546000926001600160a01b03169161102591611020908b63ffffffff611a5416565b6112f2565b9150858211156110665760405162461bcd60e51b815260040180806020018281038252602d815260200180612683602d913960400191505060405180910390fd5b60006110848361086e8b670de0b6b3a764000063ffffffff611aae16565b9050878110156110c55760405162461bcd60e51b81526004018080602001828103825260288152602001806125276028913960400191505060405180910390fd5b60006110d08a611b49565b905060006110e48b8363ffffffff611b6216565b905060006111048661086e84670de0b6b3a764000063ffffffff611aae16565b600a5490915061111a908363ffffffff611a5416565b600a5560085461113c90611134908363ffffffff611b6216565b600a546112f2565b955061115a61114d82610d7f611468565b879063ffffffff611aae16565b6006556111698533308f611f53565b6004805460408051630e14581960e21b815290516111e09389936001600160a01b03169263385160649281830192602092829003018186803b1580156111ae57600080fd5b505afa1580156111c2573d6000803e3d6000fd5b505050506040513d60208110156111d857600080fd5b505185611be1565b6111ea33826120c6565b60408051828152602081018e90528082018890529051339130917f5e9c0189949f283ec504519f5615f4f190d66083cf363875683035cfbaac9a5a9181900360600190a3965050505050506003548114610a82576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600061066f611298611953565b84610b1885600160006112a9611953565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611a5416565b60006112ea82611383565b90505b919050565b6000610b218361086e84670de0b6b3a764000063ffffffff611aae16565b60008061131c83611383565b90508061132d5760009150506112ed565b610b218161086e670de0b6b3a764000061134561068e565b9063ffffffff611aae16565b600061135b61068e565b611367575060006112ed565b6112ea61137261068e565b61086e84611345611468565b601e81565b6001600160a01b031660009081526020819052604090205490565b604051806040016040528060078152602001660444558472d4c560cc1b81525081565b600854600a54600091610ea89161086e90670de0b6b3a764000063ffffffff611aae16565b600061066f6113f3611953565b84610b18856040518060600160405280602581526020016126b0602591396001600061141d611953565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff611ea716565b600061066f611461611953565b8484611d4b565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d60208110156114dd57600080fd5b5051905090565b6005546001600160a01b031681565b600380546001019081905581611550576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a20696e76616c696420616d6f756e74000000000000000000604482015290519081900360640190fd5b600061155a611468565b6007546008549192506001600160a01b031690600090611580908663ffffffff611a5416565b600a54909150600061159283836112f2565b905060006115a6828963ffffffff611aae16565b9050600081116115fd576040805162461bcd60e51b815260206004820152601f60248201527f6465706f7369743a20696e76616c69642075736572206c697175696469747900604482015290519081900360640190fd5b61160d868963ffffffff611a5416565b9550600061162682600654611a5490919063ffffffff16565b905060006116358289856120f3565b905060006116d1611648836109b061068e565b600554604080516370a0823160e01b8152306004820152905161086e9287926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561169957600080fd5b505afa1580156116ad573d6000803e3d6000fd5b505050506040513d60208110156116c357600080fd5b50519063ffffffff611aae16565b600888905590506116e8868263ffffffff611a5416565b600a5560068390556116fa338361211e565b6117068833308e611f53565b604080518c815260208101879052815133926001600160a01b038c16927f4466433a9d9e9d68780a1f6286a07c1c7a0e597fe1af747b4ea79d013628fc9e929081900390910190a3505050505050505050610e28611a43565b600b5490565b6004546001600160a01b031681565b600954600a54600091610ea8919063ffffffff611aae16565b60006112ea826113456113c1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6004546001600160a01b0316331461181d576040805162461bcd60e51b815260206004820152601560248201527434b734ba34b0b634bd329d102337b93134b23232b760591b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038681169190911791829055604080516318160ddd60e01b8152905192909116916318160ddd91600480820192602092909190829003018186803b15801561187957600080fd5b505afa15801561188d573d6000803e3d6000fd5b505050506040513d60208110156118a357600080fd5b50518211156118f9576040805162461bcd60e51b815260206004820152601760248201527f696e697469616c697a653a20496e76616c6964205f4374000000000000000000604482015290519081900360640190fd5b6008829055600981905561191f670de0b6b3a764000061086e838563ffffffff611aae16565b600a555050600580546001600160a01b0319166001600160a01b039290921691909117905550565b61271081565b600a5490565b3390565b6001600160a01b03831661199c5760405162461bcd60e51b81526004018080602001828103825260248152602001806126006024913960400191505060405180910390fd5b6001600160a01b0382166119e15760405162461bcd60e51b81526004018080602001828103825260228152602001806124386022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610ea842600860030154612133565b600082820183811015610b21576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611abd57506000610673565b82820282848281611aca57fe5b0414610b215760405162461bcd60e51b815260040180806020018281038252602181526020018061254f6021913960400191505060405180910390fd5b6000610b2183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061214a565b60006112ea61271061086e84601e63ffffffff611aae16565b6000610b2183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ea7565b600854611bb7908263ffffffff611a5416565b600855600754611bd2906001600160a01b0316833084611f53565b611bda611a43565b600b555050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310611c5e5780518252601f199092019160209182019101611c3f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b5091509150818015611cf3575080511580611cf35750808060200190516020811015611cf057600080fd5b50515b611d44576040805162461bcd60e51b815260206004820152601960248201527f5f746f6b656e536166655472616e73666572206661696c656400000000000000604482015290519081900360640190fd5b5050505050565b6001600160a01b038316611d905760405162461bcd60e51b81526004018080602001828103825260258152602001806125b96025913960400191505060405180910390fd5b6001600160a01b038216611dd55760405162461bcd60e51b81526004018080602001828103825260238152602001806123c66023913960400191505060405180910390fd5b611e188160405180606001604052806026815260200161245a602691396001600160a01b038616600090815260208190526040902054919063ffffffff611ea716565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611e4d908263ffffffff611a5416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611f365760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611efb578181015183820152602001611ee3565b50505050905090810190601f168015611f285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611f49823083611d4b565b610e8130826121af565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611fd85780518252601f199092019160209182019101611fb9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461203a576040519150601f19603f3d011682016040523d82523d6000602084013e61203f565b606091505b509150915081801561206d57508051158061206d575080806020019051602081101561206a57600080fd5b50515b6120be576040805162461bcd60e51b815260206004820152601d60248201527f5f746f6b656e536166655472616e7366657246726f6d206661696c6564000000604482015290519081900360640190fd5b505050505050565b6008546120d9908263ffffffff611b6216565b600855600754611bd2906001600160a01b03168383611be1565b60008361210257506000610b21565b6121168461086e858563ffffffff611aae16565b949350505050565b61212830826122ab565b610e81308383611d4b565b6000818310156121435781610b21565b5090919050565b600081836121995760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611efb578181015183820152602001611ee3565b5060008385816121a557fe5b0495945050505050565b6001600160a01b0382166121f45760405162461bcd60e51b81526004018080602001828103825260218152602001806125986021913960400191505060405180910390fd5b61223781604051806060016040528060228152602001612416602291396001600160a01b038516600090815260208190526040902054919063ffffffff611ea716565b6001600160a01b038316600090815260208190526040902055600254612263908263ffffffff611b6216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216612306576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612319908263ffffffff611a5416565b6002556001600160a01b038216600090815260208190526040902054612345908263ffffffff611a5416565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe737761704578616374455448466f72546f6b656e733a20496e76616c6964207472616e73616374696f6e45524332303a207472616e7366657220746f20746865207a65726f2061646472657373737761704578616374546f6b656e73466f724554483a20496e76616c696420707269636520736c69707061676545524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e74496e737761704578616374546f6b656e73466f724554483a20496e76616c696420616d6f756e744f7574737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420455448206c6971756964697479737761704578616374455448466f72546f6b656e733a20496e76616c696420616d6f756e744f7574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737377697468647261773a20696e73756666696369656e74204554482062616c616e636545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373737761704578616374455448466f72546f6b656e733a20496e73756666696369656e74204554482062616c616e6365737761704578616374546f6b656e73466f724554483a20496e73756666696369656e7420757365722062616c616e6365737761704578616374455448466f72546f6b656e733a20496e76616c696420707269636520736c69707061676545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f737761704578616374546f6b656e73466f724554483a20496e76616c6964206f72646572a265627a7a72315820522f03b0c842cbef2e0bea3b7f30f7576db4c5229796739953179f42fe41a01064736f6c63430005110032

Deployed ByteCode Sourcemap

264:11860:2:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;264:11860:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127:55:9;;;:::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;127:55:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;870:146:3;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;870:146:3;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;656:20:2;;;:::i;:::-;;;;-1:-1:-1;;;;;656:20:2;;;;;;;;;;;;;;624:26;;;:::i;:::-;;;;;;;;;;;;;;;;374:86:3;;;:::i;6503:1752:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6503:1752:2;;;;;;;;;;;;;;;;;:::i;8561:91::-;;;:::i;1022:297:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1022:297:3;;;;;;;;;;;;;;;;;:::i;8370:92:2:-;;;:::i;3012:1490::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3012:1490:2;;:::i;:::-;;237:36:9;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8658:106:2;;;:::i;4508:1988::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4508:1988:2;;;;;;;;;;;;;;;;;:::i;1325:204:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1325:204:3;;;;;;;;:::i;8772:109:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8772:109:2;-1:-1:-1;;;;;8772:109:2;;:::i;9496:115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9496:115:2;;;;;;;:::i;8887:271::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8887:271:2;-1:-1:-1;;;;;8887:271:2;;:::i;9617:241::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9617:241:2;;:::i;470:39::-;;;:::i;466:105:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;466:105:3;-1:-1:-1;;;;;466:105:3;;:::i;188:43:9:-;;;:::i;9386:101:2:-;;;:::i;1535:255:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1535:255:3;;;;;;;;:::i;577:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;577:152:3;;;;;;;;:::i;9272:108:2:-;;;:::i;583:18::-;;;:::i;1671:1335::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1671:1335:2;;:::i;8261:101::-;;;:::i;516:31::-;;;:::i;9166:100::-;;;:::i;9866:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9866:116:2;;:::i;735:129:3:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;735:129:3;;;;;;;;;;:::i;1153:512:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;1153:512:2;;;;;;;;;;;;;;;;;;;;;;:::i;413:42::-;;;:::i;8472:83::-;;;:::i;127:55:9:-;;;;;;;;;;;;;;-1:-1:-1;;;127:55:9;;;;:::o;870:146:3:-;933:4;949:39;958:12;:10;:12::i;:::-;972:7;981:6;949:8;:39::i;:::-;-1:-1:-1;1005:4:3;870:146;;;;;:::o;656:20:2:-;;;-1:-1:-1;;;;;656:20:2;;:::o;624:26::-;;;;:::o;374:86:3:-;441:12;;374:86;:::o;6503:1752:2:-;1301:13:13;:18;;1318:1;1301:18;;;;;6720:6:2;;:28;;;-1:-1:-1;;;6720:28:2;;6737:10;6720:28;;;;;;6692:4;;1301:18:13;6752:8:2;;-1:-1:-1;;;;;6720:6:2;;;;:16;;:28;;;;;;;;;;;;;;;:6;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;6720:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6720:28:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6720:28:2;:40;;6712:101;;;;-1:-1:-1;;;6712:101:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6846:26;:24;:26::i;:::-;6835:8;:37;6827:86;;;;-1:-1:-1;;;6827:86:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6942:1;6931:8;:12;6923:64;;;;-1:-1:-1;;;6923:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7008:7;;7040:4;;7008;7133:7;-1:-1:-1;;;;;7040:4:2;;;;6997:8;;7120:40;;7133:21;;7145:8;7133:21;:11;:21;:::i;:::-;7156:3;7120:12;:40::i;:::-;7103:57;;7191:8;7178:9;:21;;7170:79;;;;-1:-1:-1;;;7170:79:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7286:14;7303:33;7331:4;7303:23;:9;7317:8;7303:23;:13;:23;:::i;:::-;:27;:33;:27;:33;:::i;:::-;7354:30;;;-1:-1:-1;;;7354:30:2;;7378:4;7354:30;;;;;;7286:50;;-1:-1:-1;7286:50:2;;-1:-1:-1;;;;;7354:15:2;;;;;:30;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;7354:30:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7354:30:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7354:30:2;:43;;7346:105;;;;-1:-1:-1;;;7346:105:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7482:12;7469:9;:25;;7461:78;;;;-1:-1:-1;;;7461:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7573:17;7593:20;7603:9;7593;:20::i;:::-;7573:40;-1:-1:-1;7623:19:2;7645:27;:9;7573:40;7645:27;:13;:27;:::i;:::-;7623:49;-1:-1:-1;7806:23:2;:3;7623:49;7806:23;:7;:23;:::i;:::-;7796:7;:33;7857:45;7871:30;7892:8;7871:16;:14;:16::i;:::-;:20;:30;:20;:30;:::i;:::-;7857:9;;:45;:13;:45;:::i;:::-;7840:14;:62;7956:41;7976:10;7988:8;7956:19;:41::i;:::-;8054:62;8081:5;8089:10;8101:14;8054:18;:62::i;:::-;8132:85;;;;;;;;;;;;;;;;;;;;8206:10;;8162:4;;8132:85;;;;;;;;;8234:14;-1:-1:-1;;;;;;1410:13:13;;1394:12;:29;1386:73;;;;;-1:-1:-1;;;1386:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;6503:1752:2;;;;;;;:::o;8561:91::-;8638:6;;-1:-1:-1;;;;;8638:6:2;8561:91;:::o;1022:297:3:-;1108:4;1124:36;1134:6;1142:9;1153:6;1124:9;:36::i;:::-;1170:121;1179:6;1187:12;:10;:12::i;:::-;1201:89;1239:6;1201:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1201:19:3;;;;;;:11;:19;;;;;;1221:12;:10;:12::i;:::-;-1:-1:-1;;;;;1201:33:3;;;;;;;;;;;;-1:-1:-1;1201:33:3;;;:89;;:37;:89;:::i;:::-;1170:8;:121::i;:::-;-1:-1:-1;1308:4:3;1022:297;;;;;;:::o;8370:92:2:-;8448:4;:7;8370:92;:::o;3012:1490::-;1301:13:13;:18;;1318:1;1301:18;;;;;3131:10:2;3123:47;;;;;-1:-1:-1;;;3123:47:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;3204:1;3188:13;:11;:13::i;:::-;:17;3180:62;;;;;-1:-1:-1;;;3180:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3285:6;3260:21;3270:10;3260:9;:21::i;:::-;:31;;3252:73;;;;;-1:-1:-1;;;3252:73:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;3361:6;;-1:-1:-1;;;;;3361:6:2;3335:15;3438:30;3461:6;3438:22;:30::i;:::-;3544:4;;:29;;;-1:-1:-1;;;3544:29:2;;3567:4;3544:29;;;;;;3424:44;;-1:-1:-1;3529:12:2;;-1:-1:-1;;;;;3544:4:2;;;;:14;;:29;;;;;;;;;;;;;;;:4;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;3544:29:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3544:29:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3544:29:2;;-1:-1:-1;3583:14:2;3600:38;3624:13;:11;:13::i;:::-;3600:19;:7;3612:6;3600:19;:11;:19;:::i;:38::-;3583:55;;3829:7;3816:9;:20;;3808:67;;;;-1:-1:-1;;;3808:67:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3937:4;:7;3965;;3988:15;3937:7;3996:6;3988:15;:7;:15;:::i;:::-;3982:21;-1:-1:-1;4019:18:2;:3;4027:9;4019:18;:7;:18;:::i;:::-;4013:24;;4097:14;4114:22;4127:3;4132;4114:12;:22::i;:::-;4097:39;;4163:43;4177:28;4198:6;4177:16;:14;:16::i;:::-;:20;:28;:20;:28;:::i;:::-;4163:9;;:43;:13;:43;:::i;:::-;4146:14;:60;4217:4;:13;;;4240:7;:13;;;4264:47;4283:7;4292:10;4304:6;4264:18;:47::i;:::-;4348:4;;4321:56;;-1:-1:-1;;;;;4348:4:2;4355:10;4367:9;4321:18;:56::i;:::-;4388:39;4408:10;4420:6;4388:19;:39::i;:::-;4442:53;;;;;;;;;;;;;;4465:10;;-1:-1:-1;;;;;4442:53:2;;;;;;;;;;;;;;894:1;;;;;;;965:26;:24;:26::i;:::-;943:19;:48;:19;1410:13:13;1394:29;;1386:73;;;;;-1:-1:-1;;;1386:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;3012:1490:2;;:::o;237:36:9:-;271:2;237:36;:::o;8658:106:2:-;8733:14;;8710:4;;8733:24;;8752:4;8733:24;:18;:24;:::i;:::-;8726:31;;8658:106;:::o;4508:1988::-;1301:13:13;:18;;1318:1;1301:18;;;;;4725:4:2;;:26;;;-1:-1:-1;;;4725:26:2;;4740:10;4725:26;;;;;;4697:4;;1301:18:13;4755:8:2;;-1:-1:-1;;;;;4725:4:2;;;;:14;;:26;;;;;;;;;;;;;;;:4;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;4725:26:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4725:26:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4725:26:2;:38;;4717:98;;;;-1:-1:-1;;;4717:98:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4844:26;:24;:26::i;:::-;4833:8;:37;4825:92;;;;-1:-1:-1;;;4825:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4946:1;4935:8;:12;4927:64;;;;-1:-1:-1;;;4927:64:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5040:4;;5210;:7;5219;;5001:14;;-1:-1:-1;;;;;5040:4:2;;5197:44;;5219:21;;5231:8;5219:21;:11;:21;:::i;:::-;5197:12;:44::i;:::-;5185:56;;5276:8;5263:9;:21;;5255:79;;;;-1:-1:-1;;;5255:79:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5397:14;5414:33;5437:9;5414:18;:8;5427:4;5414:18;:12;:18;:::i;:33::-;5397:50;;5478:12;5465:9;:25;;5457:78;;;;-1:-1:-1;;;5457:78:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5596:16;5615:19;5625:8;5615:9;:19::i;:::-;5596:38;-1:-1:-1;5644:18:2;5665:25;:8;5596:38;5665:25;:12;:25;:::i;:::-;5644:46;-1:-1:-1;5700:19:2;5722:38;5750:9;5722:23;5644:46;5740:4;5722:23;:17;:23;:::i;:38::-;5830:7;;5700:60;;-1:-1:-1;5830:26:2;;5842:13;5830:26;:11;:26;:::i;:::-;5820:7;:36;:4;5891:7;5878:50;;5891:27;;5903:14;5891:27;:11;:27;:::i;:::-;5920:7;;5878:12;:50::i;:::-;5866:62;;5955:51;5969:36;5990:14;5969:16;:14;:16::i;:36::-;5955:9;;:51;:13;:51;:::i;:::-;5938:14;:68;6063:75;6094:5;6102:10;6122:4;6129:8;6063:22;:75::i;:::-;6218:7;;;:20;;;-1:-1:-1;;;6218:20:2;;;;6183:69;;6210:5;;-1:-1:-1;;;;;6218:7:2;;:18;;:20;;;;;;;;;;;:7;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;6218:20:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6218:20:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6218:20:2;6240:11;6183:18;:69::i;:::-;6309:48;6330:10;6342:14;6309:20;:48::i;:::-;6373:85;;;;;;;;;;;;;;;;;;;;6447:10;;6403:4;;6373:85;;;;;;;;;6475:14;-1:-1:-1;;;;;;1410:13:13;;1394:12;:29;1386:73;;;;;-1:-1:-1;;;1386:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;1325:204:3;1402:4;1418:83;1427:12;:10;:12::i;:::-;1441:7;1450:50;1489:10;1450:11;:25;1462:12;:10;:12::i;:::-;-1:-1:-1;;;;;1450:25:3;;;;;;;;;;;;;;;;;-1:-1:-1;1450:25:3;;;:34;;;;;;;;;;;:50;:38;:50;:::i;8772:109:2:-;8833:4;8856:18;8866:7;8856:9;:18::i;:::-;8849:25;;8772:109;;;;:::o;9496:115::-;9559:4;9582:22;9600:3;9582:13;:3;9590:4;9582:13;:7;:13;:::i;8887:271::-;8954:4;8970:15;8988:18;8998:7;8988:9;:18::i;:::-;8970:36;-1:-1:-1;9020:15:2;9016:54;;9058:1;9051:8;;;;;9016:54;9086:65;9140:10;9086:36;9117:4;9086:13;:11;:13::i;:::-;:30;:36;:30;:36;:::i;9617:241::-;9682:4;9702:13;:11;:13::i;:::-;9698:57;;-1:-1:-1;9743:1:2;9736:8;;9698:57;9779:72;9837:13;:11;:13::i;:::-;9779:40;9813:5;9779:16;:14;:16::i;470:39::-;507:2;470:39;:::o;466:105:3:-;-1:-1:-1;;;;;546:18:3;523:4;546:18;;;;;;;;;;;;466:105::o;188:43:9:-;;;;;;;;;;;;;;-1:-1:-1;;;188:43:9;;;;:::o;9386:101:2:-;9472:4;:7;9450;;9427:4;;9450:30;;:17;;9462:4;9450:17;:11;:17;:::i;1535:255:3:-;1617:4;1633:129;1642:12;:10;:12::i;:::-;1656:7;1665:96;1704:15;1665:96;;;;;;;;;;;;;;;;;:11;:25;1677:12;:10;:12::i;:::-;-1:-1:-1;;;;;1665:25:3;;;;;;;;;;;;;;;;;-1:-1:-1;1665:25:3;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;577:152::-;643:4;659:42;669:12;:10;:12::i;:::-;683:9;694:6;659:9;:42::i;9272:108:2:-;9342:6;;:31;;;-1:-1:-1;;;9342:31:2;;9367:4;9342:31;;;;;;9319:4;;-1:-1:-1;;;;;9342:6:2;;:16;;:31;;;;;;;;;;;;;;:6;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;9342:31:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9342:31:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9342:31:2;;-1:-1:-1;9272:108:2;:::o;583:18::-;;;-1:-1:-1;;;;;583:18:2;;:::o;1671:1335::-;1301:13:13;:18;;1318:1;1301:18;;;;;1789:10:2;1781:46;;;;;-1:-1:-1;;;1781:46:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;1837:18;1858:16;:14;:16::i;:::-;1910:6;;1938:4;:7;1837:37;;-1:-1:-1;;;;;;1910:6:2;;1884:15;;1938:19;;1950:6;1938:19;:11;:19;:::i;:::-;1978:7;;1927:30;;-1:-1:-1;1967:8:2;2052:22;1927:30;1978:7;2052:12;:22::i;:::-;2035:39;-1:-1:-1;2084:14:2;2101:21;2035:39;2115:6;2101:21;:13;:21;:::i;:::-;2084:38;;2152:1;2140:9;:13;2132:57;;;;;-1:-1:-1;;;2132:57:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;2216:25;:13;2234:6;2216:25;:17;:25;:::i;:::-;2200:41;;2251:20;2274:29;2293:9;2274:14;;:18;;:29;;;;:::i;:::-;2251:52;;2347:17;2367:62;2387:15;2404:13;2419:9;2367:19;:62::i;:::-;2347:82;;2510:8;2521:84;2573:31;2591:12;2573:13;:11;:13::i;:31::-;2521:4;;:29;;;-1:-1:-1;;;2521:29:2;;2544:4;2521:29;;;;;;:47;;2555:12;;-1:-1:-1;;;;;2521:4:2;;;;:14;;:29;;;;;;;;;;;;;;;:4;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;2521:29:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2521:29:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2521:29:2;;:47;:33;:47;:::i;:84::-;2653:4;:13;;;2510:95;-1:-1:-1;2686:12:2;:3;2510:95;2686:12;:7;:12;:::i;:::-;2676:7;:22;2708:14;:32;;;2803:45;2823:10;2835:12;2803:19;:45::i;:::-;2858:66;2881:7;2890:10;2910:4;2917:6;2858:22;:66::i;:::-;2939:52;;;;;;;;;;;;;;2961:10;;-1:-1:-1;;;;;2939:52:2;;;;;;;;;;;;;;894:1;;;;;;;;;965:26;:24;:26::i;8261:101::-;8336:19;;8261:101;:::o;516:31::-;;;-1:-1:-1;;;;;516:31:2;;:::o;9166:100::-;9251:7;;9226;;9203:4;;9226:33;;:7;:33;:24;:33;:::i;9866:116::-;9929:4;9952:22;9967:6;9952:10;:8;:10::i;735:129:3:-;-1:-1:-1;;;;;830:18:3;;;807:4;830:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;735:129::o;1153:512:2:-;1290:7;;-1:-1:-1;;;;;1290:7:2;1268:10;:30;1260:64;;;;;-1:-1:-1;;;1260:64:2;;;;;;;;;;;;-1:-1:-1;;;1260:64:2;;;;;;;;;;;;;;;1335:6;:24;;-1:-1:-1;;;;;;1335:24:2;-1:-1:-1;;;;;1335:24:2;;;;;;;;;;;1385:20;;;-1:-1:-1;;;1385:20:2;;;;:6;;;;;:18;;:20;;;;;;;;;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;1385:20:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1385:20:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1385:20:2;1378:27;;;1370:63;;;;;-1:-1:-1;;;1370:63:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;1498:4;:13;;;1521:7;:13;;;1554:30;1579:4;1554:20;1531:3;1508;1554:20;:11;:20;:::i;:30::-;1544:7;:40;-1:-1:-1;;1628:4:2;:22;;-1:-1:-1;;;;;;1628:22:2;-1:-1:-1;;;;;1628:22:2;;;;;;;;;;-1:-1:-1;1153:512:2:o;413:42::-;450:5;413:42;:::o;8472:83::-;8541:7;;8472:83;:::o;82:96:1:-;161:10;82:96;:::o;2913:329:3:-;-1:-1:-1;;;;;3003:19:3;;2995:68;;;;-1:-1:-1;;;2995:68:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3081:21:3;;3073:68;;;;-1:-1:-1;;;3073:68:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3152:18:3;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;3203:32;;;;;;;;;;;;;;;;;2913:329;;;:::o;10462:135:2:-;10521:4;10544:46;10553:15;10570:4;:19;;;10544:8;:46::i;49:164:15:-;101:4;126:5;;;149:6;;;;141:46;;;;;-1:-1:-1;;;141:46:15;;;;;;;;;;;;;;;;;;;;;;;;;;;528:229;580:4;600:6;596:45;;-1:-1:-1;629:1:15;622:8;;596:45;660:5;;;664:1;660;:5;:1;683:5;;;;;:10;675:56;;;;-1:-1:-1;;;675:56:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;762:121;814:4;837:39;841:1;844;837:39;;;;;;;;;;;;;;;;;:3;:39::i;10928:121:2:-;10983:4;11006:36;450:5;11006:22;:6;507:2;11006:22;:10;:22;:::i;218:125:15:-;270:4;293:43;297:1;300;293:43;;;;;;;;;;;;;;;;;:3;:43::i;9988:238:2:-;10115:4;:7;:19;;10127:6;10115:19;:11;:19;:::i;:::-;10105:4;:29;10179:6;;10148:71;;-1:-1:-1;;;;;10179:6:2;10188:7;10205:4;10212:6;10148:22;:71::i;:::-;965:26;:24;:26::i;:::-;943:19;:48;-1:-1:-1;;9988:238:2:o;11414:323::-;11578:46;;;-1:-1:-1;;;;;11578:46:2;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11578:46:2;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11567:58:2;;;;11532:12;;11546:17;;11567:10;;;;11578:46;11567:58;;;25:18:-1;11567:58:2;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11567:58:2;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;11531:94:2;;;;11643:7;:57;;;;-1:-1:-1;11655:11:2;;:16;;:44;;;11686:4;11675:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11675:24:2;11655:44;11635:95;;;;;-1:-1:-1;;;11635:95:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;11414:323;;;;;:::o;1796:461:3:-;-1:-1:-1;;;;;1890:20:3;;1882:70;;;;-1:-1:-1;;;1882:70:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1970:23:3;;1962:71;;;;-1:-1:-1;;;1962:71:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064;2086:6;2064:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2064:17:3;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;2044:17:3;;;:9;:17;;;;;;;;;;;:91;;;;2168:20;;;;;;;:32;;2193:6;2168:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;2145:20:3;;;:9;:20;;;;;;;;;;;;:55;;;;2215:35;;;;;;;2145:20;;2215:35;;;;;;;;;;;;;1796:461;;;:::o;348:175:15:-;428:4;460:12;452:6;;;;444:29;;;;-1:-1:-1;;;444:29:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;444:29:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;492:5:15;;;348:175::o;10763:158:2:-;10838:38;10848:4;10862;10869:6;10838:9;:38::i;:::-;10886:28;10900:4;10907:6;10886:5;:28::i;11743:359::-;11933:52;;;-1:-1:-1;;;;;11933:52:2;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11933:52:2;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11922:64:2;;;;11887:12;;11901:17;;11922:10;;;;11933:52;11922:64;;;25:18:-1;11922:64:2;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11922:64:2;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;11886:100:2;;;;12004:7;:57;;;;-1:-1:-1;12016:11:2;;:16;;:44;;;12047:4;12036:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12036:24:2;12016:44;11996:99;;;;;-1:-1:-1;;;11996:99:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;11743:359;;;;;;:::o;10232:220::-;10360:4;:7;:19;;10372:6;10360:19;:11;:19;:::i;:::-;10350:4;:29;10420:6;;10393:52;;-1:-1:-1;;;;;10420:6:2;10429:7;10438:6;10393:18;:52::i;11055:353::-;11225:4;11250:20;11246:59;;-1:-1:-1;11293:1:2;11286:8;;11246:59;11325:76;11385:15;11325:42;:13;11356:10;11325:42;:30;:42;:::i;:76::-;11318:83;11055:353;-1:-1:-1;;;;11055:353:2:o;10603:154::-;10676:28;10690:4;10697:6;10676:5;:28::i;:::-;10714:36;10732:4;10739:2;10743:6;10714:9;:36::i;182:105:10:-;240:7;271:1;266;:6;;:14;;279:1;266:14;;;-1:-1:-1;275:1:10;;182:105;-1:-1:-1;182:105:10:o;888:240:15:-;968:4;1065:12;1058:5;1050:28;;;;-1:-1:-1;;;1050:28:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1050:28:15;;1088:6;1101:1;1097;:5;;;;;;;888:240;-1:-1:-1;;;;;888:240:15:o;2568:339:3:-;-1:-1:-1;;;;;2640:21:3;;2632:67;;;;-1:-1:-1;;;2632:67:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2731:68;2754:6;2731:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2731:18:3;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;2710:18:3;;:9;:18;;;;;;;;;;:89;2824:12;;:24;;2841:6;2824:24;:16;:24;:::i;:::-;2809:12;:39;2863:37;;;;;;;;2889:1;;-1:-1:-1;;;;;2863:37:3;;;;;;;;;;;;2568:339;;:::o;2263:299::-;-1:-1:-1;;;;;2335:21:3;;2327:65;;;;;-1:-1:-1;;;2327:65:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:12;;:24;;2435:6;2418:24;:16;:24;:::i;:::-;2403:12;:39;-1:-1:-1;;;;;2473:18:3;;:9;:18;;;;;;;;;;;:30;;2496:6;2473:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;2452:18:3;;:9;:18;;;;;;;;;;;:51;;;;2518:37;;;;;;;2452:18;;:9;;2518:37;;;;;;;;;;2263:299;;:::o

Swarm Source

bzzr://522f03b0c842cbef2e0bea3b7f30f7576db4c5229796739953179f42fe41a010

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