ETH Price: $2,419.61 (+3.08%)

Token

FLASH-ALT-LP Token (FLASH-ALT-LP)
 

Overview

Max Total Supply

19,469.191112235196351632 FLASH-ALT-LP

Holders

20

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
3,166.685852714249821481 FLASH-ALT-LP

Value
$0.00
0x984c5d268b220784e87fbe8edbb5c6b9f7ba9fc4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Pool

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-09
*/

// Sources flattened with hardhat v2.0.2 https://hardhat.org

// File contracts/libraries/SafeMath.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.4;

// A library for performing overflow-safe math, courtesy of DappHub: https://github.com/dapphub/ds-math/blob/d0ef6d6a5f/src/math.sol
// Modified to include only the essentials
library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "MATH:: ADD_OVERFLOW");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "MATH:: SUB_UNDERFLOW");
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MATH:: MUL_OVERFLOW");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "MATH:: DIVISION_BY_ZERO");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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


// File contracts/interfaces/IERC20.sol

pragma solidity 0.7.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function burn(uint256 value) external returns (bool);

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


// File contracts/libraries/Address.sol


pragma solidity 0.7.4;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File contracts/libraries/SafeERC20.sol


pragma solidity 0.7.4;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "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 contracts/interfaces/IFlashProtocol.sol


pragma solidity 0.7.4;

interface IFlashProtocol {
    function stake(
        uint256 _amountIn,
        uint256 _days,
        address _receiver,
        bytes calldata _data
    )
        external
        returns (
            uint256 mintedAmount,
            uint256 matchedAmount,
            bytes32 id
        );

    function unstake(bytes32 _id) external returns (uint256 withdrawAmount);

    function getFPY(uint256 _amountIn) external view returns (uint256);
}


// File contracts/pool/interfaces/IPool.sol


pragma solidity 0.7.4;

interface IPool {
    function initialize(address _token) external;

    function stakeWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) external returns (uint256 result);

    function addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin,
        address _maker
    )
        external
        returns (
            uint256,
            uint256,
            uint256
        );

    function removeLiquidity(address _maker) external returns (uint256, uint256);

    function swapWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) external returns (uint256 result);
}


// File contracts/pool/contracts/PoolERC20.sol


pragma solidity 0.7.4;


// Lightweight token modelled after UNI-LP:
// https://github.com/Uniswap/uniswap-v2-core/blob/v1.0.1/contracts/UniswapV2ERC20.sol
// Adds:
//   - An exposed `mint()` with minting role
//   - An exposed `burn()`
//   - ERC-3009 (`transferWithAuthorization()`)
//   - flashMint() - allows to flashMint an arbitrary amount of FLASH, with the
//     condition that it is burned before the end of the transaction.
contract PoolERC20 is IERC20 {
    using SafeMath for uint256;

    // bytes32 private constant EIP712DOMAIN_HASH =
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
    bytes32 private constant EIP712DOMAIN_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    // bytes32 private constant NAME_HASH = keccak256("FLASH-ALT-LP Token")
    bytes32 private constant NAME_HASH = 0xfdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c;

    // bytes32 private constant VERSION_HASH = keccak256("2")
    bytes32 private constant VERSION_HASH = 0xad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5;

    // bytes32 public constant PERMIT_TYPEHASH =
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    // bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH =
    // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)");
    bytes32
        public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267;

    string public constant name = "FLASH-ALT-LP Token";
    string public constant symbol = "FLASH-ALT-LP";
    uint8 public constant decimals = 18;

    uint256 public override totalSupply;

    address public minter;

    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;

    // ERC-2612, ERC-3009 state
    mapping(address => uint256) public nonces;
    mapping(address => mapping(bytes32 => bool)) public authorizationState;

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce);

    function _validateSignedData(
        address signer,
        bytes32 encodeData,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal view {
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", getDomainSeparator(), encodeData));
        address recoveredAddress = ecrecover(digest, v, r, s);
        // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages
        require(recoveredAddress != address(0) && recoveredAddress == signer, "FLASH-ALT-LP Token:: INVALID_SIGNATURE");
    }

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

    function _burn(address from, uint256 value) internal {
        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

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

    function _transfer(
        address from,
        address to,
        uint256 value
    ) private {
        require(to != address(0), "FLASH-ALT-LP Token:: RECEIVER_IS_TOKEN_OR_ZERO");
        // Balance is implicitly checked with SafeMath's underflow protection
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function getChainId() public pure returns (uint256 chainId) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            chainId := chainid()
        }
    }

    function getDomainSeparator() public view returns (bytes32) {
        return keccak256(abi.encode(EIP712DOMAIN_HASH, NAME_HASH, VERSION_HASH, getChainId(), address(this)));
    }

    function burn(uint256 value) external override returns (bool) {
        _burn(msg.sender, value);
        return true;
    }

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

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

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        uint256 fromAllowance = allowance[from][msg.sender];
        if (fromAllowance != uint256(-1)) {
            // Allowance is implicitly checked with SafeMath's underflow protection
            allowance[from][msg.sender] = fromAllowance.sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(deadline >= block.timestamp, "FLASH-ALT-LP Token:: AUTH_EXPIRED");

        bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner], deadline));
        nonces[owner] = nonces[owner].add(1);
        _validateSignedData(owner, encodeData, v, r, s);

        _approve(owner, spender, value);
    }

    function transferWithAuthorization(
        address from,
        address to,
        uint256 value,
        uint256 validAfter,
        uint256 validBefore,
        bytes32 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(block.timestamp > validAfter, "FLASH-ALT-LP Token:: AUTH_NOT_YET_VALID");
        require(block.timestamp < validBefore, "FLASH-ALT-LP Token:: AUTH_EXPIRED");
        require(!authorizationState[from][nonce], "FLASH-ALT-LP Token:: AUTH_ALREADY_USED");

        bytes32 encodeData = keccak256(
            abi.encode(TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce)
        );
        _validateSignedData(from, encodeData, v, r, s);

        authorizationState[from][nonce] = true;
        emit AuthorizationUsed(from, nonce);

        _transfer(from, to, value);
    }
}


// File contracts/pool/contracts/Pool.sol


pragma solidity 0.7.4;




contract Pool is PoolERC20, IPool {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 public constant MINIMUM_LIQUIDITY = 10**3;

    address public constant FLASH_TOKEN = 0x20398aD62bb2D930646d45a6D4292baa0b860C1f;
    address public constant FLASH_PROTOCOL = 0x15EB0c763581329C921C8398556EcFf85Cc48275;

    uint256 public reserveFlashAmount;
    uint256 public reserveAltAmount;
    uint256 private unlocked = 1;

    address public token;
    address public factory;

    modifier lock() {
        require(unlocked == 1, "Pool: LOCKED");
        unlocked = 0;
        _;
        unlocked = 1;
    }

    modifier onlyFactory() {
        require(msg.sender == factory, "Pool:: ONLY_FACTORY");
        _;
    }

    constructor() {
        factory = msg.sender;
    }

    function initialize(address _token) public override onlyFactory {
        token = _token;
    }

    function swapWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) public override lock onlyFactory returns (uint256 result) {
        result = getAPYSwap(_amountIn);
        require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER");
        calcNewReserveSwap(_amountIn, result);
        IERC20(FLASH_TOKEN).safeTransfer(_staker, result);
    }

    function stakeWithFeeRewardDistribution(
        uint256 _amountIn,
        address _staker,
        uint256 _expectedOutput
    ) public override lock onlyFactory returns (uint256 result) {
        result = getAPYStake(_amountIn);
        require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER");
        calcNewReserveStake(_amountIn, result);
        IERC20(token).safeTransfer(_staker, result);
    }

    function addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin,
        address _maker
    )
        public
        override
        onlyFactory
        returns (
            uint256 amountFLASH,
            uint256 amountALT,
            uint256 liquidity
        )
    {
        (amountFLASH, amountALT) = _addLiquidity(_amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin);
        liquidity = mintLiquidityTokens(_maker, amountFLASH, amountALT);
        calcNewReserveAddLiquidity(amountFLASH, amountALT);
    }

    function removeLiquidity(address _maker)
        public
        override
        onlyFactory
        returns (uint256 amountFLASH, uint256 amountALT)
    {
        (amountFLASH, amountALT) = burn(_maker);
    }

    function getAPYStake(uint256 _amountIn) public view returns (uint256 result) {
        uint256 amountInWithFee = _amountIn.mul(getLPFee());
        uint256 num = amountInWithFee.mul(reserveAltAmount);
        uint256 den = (reserveFlashAmount.mul(1000)).add(amountInWithFee);
        result = num.div(den);
    }

    function getAPYSwap(uint256 _amountIn) public view returns (uint256 result) {
        uint256 amountInWithFee = _amountIn.mul(getLPFee());
        uint256 num = amountInWithFee.mul(reserveFlashAmount);
        uint256 den = (reserveAltAmount.mul(1000)).add(amountInWithFee);
        result = num.div(den);
    }

    function getLPFee() public view returns (uint256) {
        uint256 fpy = IFlashProtocol(FLASH_PROTOCOL).getFPY(0);
        return uint256(1000).sub(fpy.div(5e15));
    }

    function quote(
        uint256 _amountA,
        uint256 _reserveA,
        uint256 _reserveB
    ) public pure returns (uint256 amountB) {
        require(_amountA > 0, "Pool:: INSUFFICIENT_AMOUNT");
        require(_reserveA > 0 && _reserveB > 0, "Pool:: INSUFFICIENT_LIQUIDITY");
        amountB = _amountA.mul(_reserveB).div(_reserveA);
    }

    function burn(address to) private lock returns (uint256 amountFLASH, uint256 amountALT) {
        uint256 balanceFLASH = IERC20(FLASH_TOKEN).balanceOf(address(this));
        uint256 balanceALT = IERC20(token).balanceOf(address(this));
        uint256 liquidity = balanceOf[address(this)];

        amountFLASH = liquidity.mul(balanceFLASH) / totalSupply;
        amountALT = liquidity.mul(balanceALT) / totalSupply;

        require(amountFLASH > 0 && amountALT > 0, "Pool:: INSUFFICIENT_LIQUIDITY_BURNED");

        _burn(address(this), liquidity);

        IERC20(FLASH_TOKEN).safeTransfer(to, amountFLASH);
        IERC20(token).safeTransfer(to, amountALT);

        balanceFLASH = balanceFLASH.sub(IERC20(FLASH_TOKEN).balanceOf(address(this)));
        balanceALT = balanceALT.sub(IERC20(token).balanceOf(address(this)));

        calcNewReserveRemoveLiquidity(balanceFLASH, balanceALT);
    }

    function _addLiquidity(
        uint256 _amountFLASH,
        uint256 _amountALT,
        uint256 _amountFLASHMin,
        uint256 _amountALTMin
    ) private view returns (uint256 amountFLASH, uint256 amountALT) {
        if (reserveAltAmount == 0 && reserveFlashAmount == 0) {
            (amountFLASH, amountALT) = (_amountFLASH, _amountALT);
        } else {
            uint256 amountALTQuote = quote(_amountFLASH, reserveFlashAmount, reserveAltAmount);
            if (amountALTQuote <= _amountALT) {
                require(amountALTQuote >= _amountALTMin, "Pool:: INSUFFICIENT_B_AMOUNT");
                (amountFLASH, amountALT) = (_amountFLASH, amountALTQuote);
            } else {
                uint256 amountFLASHQuote = quote(_amountALT, reserveAltAmount, reserveFlashAmount);
                require(
                    (amountFLASHQuote <= _amountFLASH) && (amountFLASHQuote >= _amountFLASHMin),
                    "Pool:: INSUFFICIENT_A_AMOUNT"
                );
                (amountFLASH, amountALT) = (amountFLASHQuote, _amountALT);
            }
        }
    }

    function mintLiquidityTokens(
        address _to,
        uint256 _flashAmount,
        uint256 _altAmount
    ) private returns (uint256 liquidity) {
        if (totalSupply == 0) {
            liquidity = SafeMath.sqrt(_flashAmount.mul(_altAmount)).sub(MINIMUM_LIQUIDITY);
            _mint(address(0), MINIMUM_LIQUIDITY);
        } else {
            liquidity = SafeMath.min(
                _flashAmount.mul(totalSupply) / reserveFlashAmount,
                _altAmount.mul(totalSupply) / reserveAltAmount
            );
        }
        require(liquidity > 0, "Pool:: INSUFFICIENT_LIQUIDITY_MINTED");
        _mint(_to, liquidity);
    }

    function calcNewReserveStake(uint256 _amountIn, uint256 _amountOut) private {
        reserveFlashAmount = reserveFlashAmount.add(_amountIn);
        reserveAltAmount = reserveAltAmount.sub(_amountOut);
    }

    function calcNewReserveSwap(uint256 _amountIn, uint256 _amountOut) private {
        reserveFlashAmount = reserveFlashAmount.sub(_amountOut);
        reserveAltAmount = reserveAltAmount.add(_amountIn);
    }

    function calcNewReserveAddLiquidity(uint256 _amountFLASH, uint256 _amountALT) private {
        reserveFlashAmount = reserveFlashAmount.add(_amountFLASH);
        reserveAltAmount = reserveAltAmount.add(_amountALT);
    }

    function calcNewReserveRemoveLiquidity(uint256 _amountFLASH, uint256 _amountALT) private {
        reserveFlashAmount = reserveFlashAmount.sub(_amountFLASH);
        reserveAltAmount = reserveAltAmount.sub(_amountALT);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FLASH_PROTOCOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"internalType":"uint256","name":"_amountALT","type":"uint256"},{"internalType":"uint256","name":"_amountFLASHMin","type":"uint256"},{"internalType":"uint256","name":"_amountALTMin","type":"uint256"},{"internalType":"address","name":"_maker","type":"address"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountFLASH","type":"uint256"},{"internalType":"uint256","name":"amountALT","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getAPYStake","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"getAPYSwap","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountA","type":"uint256"},{"internalType":"uint256","name":"_reserveA","type":"uint256"},{"internalType":"uint256","name":"_reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_maker","type":"address"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountFLASH","type":"uint256"},{"internalType":"uint256","name":"amountALT","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAltAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveFlashAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_expectedOutput","type":"uint256"}],"name":"stakeWithFeeRewardDistribution","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_expectedOutput","type":"uint256"}],"name":"swapWithFeeRewardDistribution","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600160085534801561001557600080fd5b50600a80546001600160a01b031916331790556121fa806100376000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab0772146105ff578063e3ee160e1461065b578063e94a0102146106ba578063ed24911d146106e6578063fc0c546a146106ee57610211565b8063c4d66de814610519578063d505accf14610541578063d798f86e14610592578063dd62ed3e146105d157610211565b8063a9059cbb116100f4578063a9059cbb146104ac578063ad615dec146104d8578063ba9a7a5614610501578063c0bd9f1614610509578063c45a01551461051157610211565b806395d89b4114610477578063a0cc6a681461047f578063a10adb1714610487578063a7f0e903146104a457610211565b80633408e470116101a85780634d861ece116101775780634d861ece146103bf57806350b814a0146103c7578063687fbed8146103f957806370a082311461042b5780637ecebe001461045157610211565b80633408e470146103755780633750a8bd1461037d578063411542701461038557806342966c68146103a257610211565b806323b872dd116101e457806323b872dd1461031157806323c6e14c1461034757806330adf81f1461034f578063313ce5671461035757610211565b806306fdde03146102165780630754617214610293578063095ea7b3146102b757806318160ddd146102f7575b600080fd5b61021e6106f6565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029b610724565b604080516001600160a01b039092168252519081900360200190f35b6102e3600480360360408110156102cd57600080fd5b506001600160a01b038135169060200135610733565b604080519115158252519081900360200190f35b6102ff61074a565b60408051918252519081900360200190f35b6102e36004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610750565b61029b6107c4565b6102ff6107dc565b61035f610800565b6040805160ff9092168252519081900360200190f35b6102ff610805565b6102ff610809565b6102ff6004803603602081101561039b57600080fd5b50356108b6565b6102e3600480360360208110156103b857600080fd5b503561091e565b6102ff610933565b6102ff600480360360608110156103dd57600080fd5b508035906001600160a01b036020820135169060400135610939565b6102ff6004803603606081101561040f57600080fd5b508035906001600160a01b036020820135169060400135610a70565b6102ff6004803603602081101561044157600080fd5b50356001600160a01b0316610b93565b6102ff6004803603602081101561046757600080fd5b50356001600160a01b0316610ba5565b61021e610bb7565b6102ff610bdf565b6102ff6004803603602081101561049d57600080fd5b5035610c03565b61029b610c49565b6102e3600480360360408110156104c257600080fd5b506001600160a01b038135169060200135610c61565b6102ff600480360360608110156104ee57600080fd5b5080359060208101359060400135610c6e565b6102ff610d41565b6102ff610d47565b61029b610d4d565b61053f6004803603602081101561052f57600080fd5b50356001600160a01b0316610d5c565b005b61053f600480360360e081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610dd3565b6105b8600480360360208110156105a857600080fd5b50356001600160a01b0316610ee2565b6040805192835260208301919091528051918290030190f35b6102ff600480360360408110156105e757600080fd5b506001600160a01b0381358116916020013516610f4f565b61063d600480360360a081101561061557600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610f6c565b60408051938452602084019290925282820152519081900360600190f35b61053f600480360361012081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ffb565b6102e3600480360360408110156106d057600080fd5b506001600160a01b0381351690602001356111cd565b6102ff6111ed565b61029b6112ab565b60405180604001604052806012815260200171232620a9a416a0a62a16a628102a37b5b2b760711b81525081565b6001546001600160a01b031681565b60006107403384846112ba565b5060015b92915050565b60005481565b6001600160a01b038316600090815260036020908152604080832033845290915281205460001981146107ac57610787818461131c565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b6107b785858561136b565b60019150505b9392505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b4690565b6000807315eb0c763581329c921c8398556ecff85cc482756001600160a01b031663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b505190506108b06108a7826611c37937e0800061145e565b6103e89061131c565b91505090565b6000806108cb6108c4610809565b84906114c8565b905060006108e4600754836114c890919063ffffffff16565b90506000610909836109036103e86006546114c890919063ffffffff16565b9061152d565b9050610915828261145e565b95945050505050565b600061092a338361157b565b5060015b919050565b60065481565b6000600854600114610981576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b031633146109db576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b6109e484610c03565b905080821115610a3b576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610a45848261160d565b610a647320398ad62bb2d930646d45a6d4292baa0b860c1f8483611631565b60016008559392505050565b6000600854600114610ab8576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b03163314610b12576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610b1b846108b6565b905080821115610b72576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610b7c8482611688565b600954610a64906001600160a01b03168483611631565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600c81526020016b0464c4153482d414c542d4c560a41b81525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b600080610c116108c4610809565b90506000610c2a600654836114c890919063ffffffff16565b90506000610909836109036103e86007546114c890919063ffffffff16565b7315eb0c763581329c921c8398556ecff85cc4827581565b600061074033848461136b565b6000808411610cc4576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a20494e53554646494349454e545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015610cd45750600082115b610d25576040805162461bcd60e51b815260206004820152601d60248201527f506f6f6c3a3a20494e53554646494349454e545f4c4951554944495459000000604482015290519081900360640190fd5b610d3983610d3386856114c8565b9061145e565b949350505050565b6103e881565b60075481565b600a546001600160a01b031681565b600a546001600160a01b03163314610db1576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b42841015610e125760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b0380881660008181526004602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968d166060880152608087018c905260a0870181905260c08088018c90528251808903909101815260e090970190915285519582019590952093909252905290610ea790600161152d565b6001600160a01b038916600090815260046020526040902055610ecd88828686866116a5565b610ed88888886112ba565b5050505050505050565b600a5460009081906001600160a01b03163314610f3c576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610f45836117c2565b9094909350915050565b600360209081526000928352604080842090915290825290205481565b600a54600090819081906001600160a01b03163314610fc8576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610fd488888888611b03565b9093509150610fe4848484611c26565b9050610ff08383611cf4565b955095509592505050565b8542116110395760405162461bcd60e51b815260040180806020018281038252602781526020018061212c6027913960400191505060405180910390fd5b8442106110775760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b038916600090815260056020908152604080832087845290915290205460ff16156110da5760405162461bcd60e51b81526004018080602001828103825260268152602001806120916026913960400191505060405180910390fd5b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22676020808301919091526001600160a01b03808d16838501528b166060830152608082018a905260a0820189905260c0820188905260e08083018890528351808403909101815261010090920190925280519101206111608a828686866116a5565b6001600160a01b038a166000818152600560209081526040808320898452909152808220805460ff19166001179055518792917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36111c18a8a8a61136b565b50505050505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c7fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a561125a610805565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b6009546001600160a01b031681565b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610744576040805162461bcd60e51b81526020600482015260146024820152734d4154483a3a205355425f554e444552464c4f5760601b604482015290519081900360640190fd5b6001600160a01b0382166113b05760405162461bcd60e51b815260040180806020018281038252602e8152602001806120b7602e913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546113d3908261131c565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611402908261152d565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008082116114b4576040805162461bcd60e51b815260206004820152601760248201527f4d4154483a3a204449564953494f4e5f42595f5a45524f000000000000000000604482015290519081900360640190fd5b60008284816114bf57fe5b04949350505050565b6000826114d757506000610744565b828202828482816114e457fe5b04146107bd576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204d554c5f4f564552464c4f5760681b604482015290519081900360640190fd5b80820182811015610744576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090205461159e908261131c565b6001600160a01b038316600090815260026020526040812091909155546115c5908261131c565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b60065461161a908261131c565b60065560075461162a908361152d565b6007555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611683908490611d11565b505050565b600654611695908361152d565b60065560075461162a908261131c565b60006116af6111ed565b85604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611748573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061177e5750866001600160a01b0316816001600160a01b0316145b6117b95760405162461bcd60e51b81526004018080602001828103825260268152602001806121066026913960400191505060405180910390fd5b50505050505050565b60008060085460011461180b576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b60006008819055604080516370a0823160e01b815230600482015290517320398ad62bb2d930646d45a6d4292baa0b860c1f916370a08231916024808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b5051600954604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50513060009081526002602052604081205490549192509061192c82856114c8565b8161193357fe5b600054919004955061194582846114c8565b8161194c57fe5b04935060008511801561195f5750600084115b61199a5760405162461bcd60e51b81526004018080602001828103825260248152602001806121536024913960400191505060405180910390fd5b6119a4308261157b565b6119c37320398ad62bb2d930646d45a6d4292baa0b860c1f8787611631565b6009546119da906001600160a01b03168786611631565b604080516370a0823160e01b81523060048201529051611a63917320398ad62bb2d930646d45a6d4292baa0b860c1f916370a0823191602480820192602092909190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051849061131c565b600954604080516370a0823160e01b81523060048201529051929550611ae8926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d6020811015611adf57600080fd5b5051839061131c565b9150611af48383611dc2565b50506001600855509092909150565b6000806007546000148015611b185750600654155b15611b27575084905083611c1d565b6000611b3887600654600754610c6e565b9050858111611ba15783811015611b96576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e5400000000604482015290519081900360640190fd5b869250905080611c1b565b6000611bb287600754600654610c6e565b9050878111158015611bc45750858110155b611c15576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e5400000000604482015290519081900360640190fd5b92508591505b505b94509492505050565b60008054611c6057611c4c6103e8611c46611c4186866114c8565b611dcf565b9061131c565b9050611c5b60006103e8611e20565b611cab565b611ca8600654611c7b600054866114c890919063ffffffff16565b81611c8257fe5b04600754611c9b600054866114c890919063ffffffff16565b81611ca257fe5b04611eaa565b90505b60008111611cea5760405162461bcd60e51b81526004018080602001828103825260248152602001806121776024913960400191505060405180910390fd5b6107bd8482611e20565b600654611d01908361152d565b60065560075461162a908261152d565b6060611d66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ec09092919063ffffffff16565b80519091501561168357808060200190516020811015611d8557600080fd5b50516116835760405162461bcd60e51b815260040180806020018281038252602a81526020018061219b602a913960400191505060405180910390fd5b600654611695908361131c565b60006003821115611e12575080600160028204015b81811015611e0c57809150600281828581611dfb57fe5b040181611e0457fe5b049050611de4565b5061092e565b811561092e57506001919050565b600054611e2d908261152d565b60009081556001600160a01b038316815260026020526040902054611e52908261152d565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310611eb957816107bd565b5090919050565b6060610d39848460008585611ed485611fe6565b611f25576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611f645780518252601f199092019160209182019101611f45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdb828286611fec565b979650505050505050565b3b151590565b60608315611ffb5750816107bd565b82511561200b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205557818101518382015260200161203d565b50505050905090810190601f1680156120825780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e5445445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209683472579f7daa8f010c335cb11c4719f0438a7518f90532d9eeb74d4a6858464736f6c63430007040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab0772146105ff578063e3ee160e1461065b578063e94a0102146106ba578063ed24911d146106e6578063fc0c546a146106ee57610211565b8063c4d66de814610519578063d505accf14610541578063d798f86e14610592578063dd62ed3e146105d157610211565b8063a9059cbb116100f4578063a9059cbb146104ac578063ad615dec146104d8578063ba9a7a5614610501578063c0bd9f1614610509578063c45a01551461051157610211565b806395d89b4114610477578063a0cc6a681461047f578063a10adb1714610487578063a7f0e903146104a457610211565b80633408e470116101a85780634d861ece116101775780634d861ece146103bf57806350b814a0146103c7578063687fbed8146103f957806370a082311461042b5780637ecebe001461045157610211565b80633408e470146103755780633750a8bd1461037d578063411542701461038557806342966c68146103a257610211565b806323b872dd116101e457806323b872dd1461031157806323c6e14c1461034757806330adf81f1461034f578063313ce5671461035757610211565b806306fdde03146102165780630754617214610293578063095ea7b3146102b757806318160ddd146102f7575b600080fd5b61021e6106f6565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029b610724565b604080516001600160a01b039092168252519081900360200190f35b6102e3600480360360408110156102cd57600080fd5b506001600160a01b038135169060200135610733565b604080519115158252519081900360200190f35b6102ff61074a565b60408051918252519081900360200190f35b6102e36004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610750565b61029b6107c4565b6102ff6107dc565b61035f610800565b6040805160ff9092168252519081900360200190f35b6102ff610805565b6102ff610809565b6102ff6004803603602081101561039b57600080fd5b50356108b6565b6102e3600480360360208110156103b857600080fd5b503561091e565b6102ff610933565b6102ff600480360360608110156103dd57600080fd5b508035906001600160a01b036020820135169060400135610939565b6102ff6004803603606081101561040f57600080fd5b508035906001600160a01b036020820135169060400135610a70565b6102ff6004803603602081101561044157600080fd5b50356001600160a01b0316610b93565b6102ff6004803603602081101561046757600080fd5b50356001600160a01b0316610ba5565b61021e610bb7565b6102ff610bdf565b6102ff6004803603602081101561049d57600080fd5b5035610c03565b61029b610c49565b6102e3600480360360408110156104c257600080fd5b506001600160a01b038135169060200135610c61565b6102ff600480360360608110156104ee57600080fd5b5080359060208101359060400135610c6e565b6102ff610d41565b6102ff610d47565b61029b610d4d565b61053f6004803603602081101561052f57600080fd5b50356001600160a01b0316610d5c565b005b61053f600480360360e081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610dd3565b6105b8600480360360208110156105a857600080fd5b50356001600160a01b0316610ee2565b6040805192835260208301919091528051918290030190f35b6102ff600480360360408110156105e757600080fd5b506001600160a01b0381358116916020013516610f4f565b61063d600480360360a081101561061557600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610f6c565b60408051938452602084019290925282820152519081900360600190f35b61053f600480360361012081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ffb565b6102e3600480360360408110156106d057600080fd5b506001600160a01b0381351690602001356111cd565b6102ff6111ed565b61029b6112ab565b60405180604001604052806012815260200171232620a9a416a0a62a16a628102a37b5b2b760711b81525081565b6001546001600160a01b031681565b60006107403384846112ba565b5060015b92915050565b60005481565b6001600160a01b038316600090815260036020908152604080832033845290915281205460001981146107ac57610787818461131c565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b6107b785858561136b565b60019150505b9392505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b4690565b6000807315eb0c763581329c921c8398556ecff85cc482756001600160a01b031663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b505190506108b06108a7826611c37937e0800061145e565b6103e89061131c565b91505090565b6000806108cb6108c4610809565b84906114c8565b905060006108e4600754836114c890919063ffffffff16565b90506000610909836109036103e86006546114c890919063ffffffff16565b9061152d565b9050610915828261145e565b95945050505050565b600061092a338361157b565b5060015b919050565b60065481565b6000600854600114610981576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b031633146109db576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b6109e484610c03565b905080821115610a3b576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610a45848261160d565b610a647320398ad62bb2d930646d45a6d4292baa0b860c1f8483611631565b60016008559392505050565b6000600854600114610ab8576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b03163314610b12576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610b1b846108b6565b905080821115610b72576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610b7c8482611688565b600954610a64906001600160a01b03168483611631565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600c81526020016b0464c4153482d414c542d4c560a41b81525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b600080610c116108c4610809565b90506000610c2a600654836114c890919063ffffffff16565b90506000610909836109036103e86007546114c890919063ffffffff16565b7315eb0c763581329c921c8398556ecff85cc4827581565b600061074033848461136b565b6000808411610cc4576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a20494e53554646494349454e545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015610cd45750600082115b610d25576040805162461bcd60e51b815260206004820152601d60248201527f506f6f6c3a3a20494e53554646494349454e545f4c4951554944495459000000604482015290519081900360640190fd5b610d3983610d3386856114c8565b9061145e565b949350505050565b6103e881565b60075481565b600a546001600160a01b031681565b600a546001600160a01b03163314610db1576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b42841015610e125760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b0380881660008181526004602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968d166060880152608087018c905260a0870181905260c08088018c90528251808903909101815260e090970190915285519582019590952093909252905290610ea790600161152d565b6001600160a01b038916600090815260046020526040902055610ecd88828686866116a5565b610ed88888886112ba565b5050505050505050565b600a5460009081906001600160a01b03163314610f3c576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610f45836117c2565b9094909350915050565b600360209081526000928352604080842090915290825290205481565b600a54600090819081906001600160a01b03163314610fc8576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610fd488888888611b03565b9093509150610fe4848484611c26565b9050610ff08383611cf4565b955095509592505050565b8542116110395760405162461bcd60e51b815260040180806020018281038252602781526020018061212c6027913960400191505060405180910390fd5b8442106110775760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b038916600090815260056020908152604080832087845290915290205460ff16156110da5760405162461bcd60e51b81526004018080602001828103825260268152602001806120916026913960400191505060405180910390fd5b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22676020808301919091526001600160a01b03808d16838501528b166060830152608082018a905260a0820189905260c0820188905260e08083018890528351808403909101815261010090920190925280519101206111608a828686866116a5565b6001600160a01b038a166000818152600560209081526040808320898452909152808220805460ff19166001179055518792917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36111c18a8a8a61136b565b50505050505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c7fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a561125a610805565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b6009546001600160a01b031681565b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610744576040805162461bcd60e51b81526020600482015260146024820152734d4154483a3a205355425f554e444552464c4f5760601b604482015290519081900360640190fd5b6001600160a01b0382166113b05760405162461bcd60e51b815260040180806020018281038252602e8152602001806120b7602e913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546113d3908261131c565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611402908261152d565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008082116114b4576040805162461bcd60e51b815260206004820152601760248201527f4d4154483a3a204449564953494f4e5f42595f5a45524f000000000000000000604482015290519081900360640190fd5b60008284816114bf57fe5b04949350505050565b6000826114d757506000610744565b828202828482816114e457fe5b04146107bd576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204d554c5f4f564552464c4f5760681b604482015290519081900360640190fd5b80820182811015610744576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090205461159e908261131c565b6001600160a01b038316600090815260026020526040812091909155546115c5908261131c565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b60065461161a908261131c565b60065560075461162a908361152d565b6007555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611683908490611d11565b505050565b600654611695908361152d565b60065560075461162a908261131c565b60006116af6111ed565b85604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611748573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061177e5750866001600160a01b0316816001600160a01b0316145b6117b95760405162461bcd60e51b81526004018080602001828103825260268152602001806121066026913960400191505060405180910390fd5b50505050505050565b60008060085460011461180b576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b60006008819055604080516370a0823160e01b815230600482015290517320398ad62bb2d930646d45a6d4292baa0b860c1f916370a08231916024808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b5051600954604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50513060009081526002602052604081205490549192509061192c82856114c8565b8161193357fe5b600054919004955061194582846114c8565b8161194c57fe5b04935060008511801561195f5750600084115b61199a5760405162461bcd60e51b81526004018080602001828103825260248152602001806121536024913960400191505060405180910390fd5b6119a4308261157b565b6119c37320398ad62bb2d930646d45a6d4292baa0b860c1f8787611631565b6009546119da906001600160a01b03168786611631565b604080516370a0823160e01b81523060048201529051611a63917320398ad62bb2d930646d45a6d4292baa0b860c1f916370a0823191602480820192602092909190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051849061131c565b600954604080516370a0823160e01b81523060048201529051929550611ae8926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d6020811015611adf57600080fd5b5051839061131c565b9150611af48383611dc2565b50506001600855509092909150565b6000806007546000148015611b185750600654155b15611b27575084905083611c1d565b6000611b3887600654600754610c6e565b9050858111611ba15783811015611b96576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e5400000000604482015290519081900360640190fd5b869250905080611c1b565b6000611bb287600754600654610c6e565b9050878111158015611bc45750858110155b611c15576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e5400000000604482015290519081900360640190fd5b92508591505b505b94509492505050565b60008054611c6057611c4c6103e8611c46611c4186866114c8565b611dcf565b9061131c565b9050611c5b60006103e8611e20565b611cab565b611ca8600654611c7b600054866114c890919063ffffffff16565b81611c8257fe5b04600754611c9b600054866114c890919063ffffffff16565b81611ca257fe5b04611eaa565b90505b60008111611cea5760405162461bcd60e51b81526004018080602001828103825260248152602001806121776024913960400191505060405180910390fd5b6107bd8482611e20565b600654611d01908361152d565b60065560075461162a908261152d565b6060611d66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ec09092919063ffffffff16565b80519091501561168357808060200190516020811015611d8557600080fd5b50516116835760405162461bcd60e51b815260040180806020018281038252602a81526020018061219b602a913960400191505060405180910390fd5b600654611695908361131c565b60006003821115611e12575080600160028204015b81811015611e0c57809150600281828581611dfb57fe5b040181611e0457fe5b049050611de4565b5061092e565b811561092e57506001919050565b600054611e2d908261152d565b60009081556001600160a01b038316815260026020526040902054611e52908261152d565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310611eb957816107bd565b5090919050565b6060610d39848460008585611ed485611fe6565b611f25576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611f645780518252601f199092019160209182019101611f45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdb828286611fec565b979650505050505050565b3b151590565b60608315611ffb5750816107bd565b82511561200b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205557818101518382015260200161203d565b50505050905090810190601f1680156120825780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e5445445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209683472579f7daa8f010c335cb11c4719f0438a7518f90532d9eeb74d4a6858464736f6c63430007040033

Deployed Bytecode Sourcemap

22031:7457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16641:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16839:21;;;:::i;:::-;;;;-1:-1:-1;;;;;16839:21:0;;;;;;;;;;;;;;19673:159;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19673:159:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16795:35;;;:::i;:::-;;;;;;;;;;;;;;;;19999:469;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19999:469:0;;;;;;;;;;;;;;;;;:::i;22198:80::-;;;:::i;16166:108::-;;;:::i;16751:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19152:190;;;:::i;25332:173::-;;;:::i;24683:317::-;;;;;;;;;;;;;;;;-1:-1:-1;24683:317:0;;:::i;19538:127::-;;;;;;;;;;;;;;;;-1:-1:-1;19538:127:0;;:::i;22377:33::-;;;:::i;22970:424::-;;;;;;;;;;;;;;;;-1:-1:-1;22970:424:0;;;-1:-1:-1;;;;;22970:424:0;;;;;;;;;;:::i;23402:421::-;;;;;;;;;;;;;;;;-1:-1:-1;23402:421:0;;;-1:-1:-1;;;;;23402:421:0;;;;;;;;;;:::i;16869:53::-;;;;;;;;;;;;;;;;-1:-1:-1;16869:53:0;-1:-1:-1;;;;;16869:53:0;;:::i;17044:41::-;;;;;;;;;;;;;;;;-1:-1:-1;17044:41:0;-1:-1:-1;;;;;17044:41:0;;:::i;16698:46::-;;;:::i;16494:138::-;;;:::i;25008:316::-;;;;;;;;;;;;;;;;-1:-1:-1;25008:316:0;;:::i;22285:83::-;;;:::i;19840:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19840:151:0;;;;;;;;:::i;25513:355::-;;;;;;;;;;;;;;;;-1:-1:-1;25513:355:0;;;;;;;;;;;;:::i;22140:49::-;;;:::i;22417:31::-;;;:::i;22519:22::-;;;:::i;22865:97::-;;;;;;;;;;;;;;;;-1:-1:-1;22865:97:0;-1:-1:-1;;;;;22865:97:0;;:::i;:::-;;20476:561;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20476:561:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24458:217::-;;;;;;;;;;;;;;;;-1:-1:-1;24458:217:0;-1:-1:-1;;;;;24458:217:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16929:73;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16929:73:0;;;;;;;;;;:::i;23831:619::-;;;;;;;;;;;;;;;;-1:-1:-1;23831:619:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23831:619:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21045:898;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21045:898:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17092:70::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17092:70:0;;;;;;;;:::i;19350:180::-;;;:::i;22492:20::-;;;:::i;16641:50::-;;;;;;;;;;;;;;-1:-1:-1;;;16641:50:0;;;;:::o;16839:21::-;;;-1:-1:-1;;;;;16839:21:0;;:::o;19673:159::-;19749:4;19766:36;19775:10;19787:7;19796:5;19766:8;:36::i;:::-;-1:-1:-1;19820:4:0;19673:159;;;;;:::o;16795:35::-;;;;:::o;19999:469::-;-1:-1:-1;;;;;20164:15:0;;20123:4;20164:15;;;:9;:15;;;;;;;;20180:10;20164:27;;;;;;;;-1:-1:-1;;20206:28:0;;20202:200;;20366:24;:13;20384:5;20366:17;:24::i;:::-;-1:-1:-1;;;;;20336:15:0;;;;;;:9;:15;;;;;;;;20352:10;20336:27;;;;;;;:54;20202:200;20412:26;20422:4;20428:2;20432:5;20412:9;:26::i;:::-;20456:4;20449:11;;;19999:469;;;;;;:::o;22198:80::-;22236:42;22198:80;:::o;16166:108::-;16208:66;16166:108;:::o;16751:35::-;16784:2;16751:35;:::o;19152:190::-;19315:9;;19289:46::o;25332:173::-;25373:7;25393:11;22326:42;-1:-1:-1;;;;;25407:37:0;;25445:1;25407:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25407:40:0;;-1:-1:-1;25465:32:0;25483:13;25407:40;25491:4;25483:7;:13::i;:::-;25473:4;;25465:17;:32::i;:::-;25458:39;;;25332:173;:::o;24683:317::-;24744:14;24771:23;24797:25;24811:10;:8;:10::i;:::-;24797:9;;:13;:25::i;:::-;24771:51;;24833:11;24847:37;24867:16;;24847:15;:19;;:37;;;;:::i;:::-;24833:51;;24895:11;24909:51;24944:15;24910:28;24933:4;24910:18;;:22;;:28;;;;:::i;:::-;24909:34;;:51::i;:::-;24895:65;-1:-1:-1;24980:12:0;:3;24895:65;24980:7;:12::i;:::-;24971:21;24683:317;-1:-1:-1;;;;;24683:317:0:o;19538:127::-;19594:4;19611:24;19617:10;19629:5;19611;:24::i;:::-;-1:-1:-1;19653:4:0;19538:127;;;;:::o;22377:33::-;;;;:::o;22970:424::-;23146:14;22585:8;;22597:1;22585:13;22577:38;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;;;;22637:1;22626:8;:12;22745:7:::1;::::0;-1:-1:-1;;;;;22745:7:0::1;22731:10;:21;22723:53;;;::::0;;-1:-1:-1;;;22723:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;;::::1;;23182:21:::2;23193:9;23182:10;:21::i;:::-;23173:30;;23241:6;23222:15;:25;;23214:64;;;::::0;;-1:-1:-1;;;23214:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;23289:37;23308:9;23319:6;23289:18;:37::i;:::-;23337:49;22236:42;23370:7:::0;23379:6;23337:32:::2;:49::i;:::-;22672:1:::0;22661:8;:12;22970:424;;-1:-1:-1;;;22970:424:0:o;23402:421::-;23579:14;22585:8;;22597:1;22585:13;22577:38;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;;;;22637:1;22626:8;:12;22745:7:::1;::::0;-1:-1:-1;;;;;22745:7:0::1;22731:10;:21;22723:53;;;::::0;;-1:-1:-1;;;22723:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;;::::1;;23615:22:::2;23627:9;23615:11;:22::i;:::-;23606:31;;23675:6;23656:15;:25;;23648:64;;;::::0;;-1:-1:-1;;;23648:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;23723:38;23743:9;23754:6;23723:19;:38::i;:::-;23779:5;::::0;23772:43:::2;::::0;-1:-1:-1;;;;;23779:5:0::2;23799:7:::0;23808:6;23772:26:::2;:43::i;16869:53::-:0;;;;;;;;;;;;;:::o;17044:41::-;;;;;;;;;;;;;:::o;16698:46::-;;;;;;;;;;;;;;-1:-1:-1;;;16698:46:0;;;;:::o;16494:138::-;16566:66;16494:138;:::o;25008:316::-;25068:14;25095:23;25121:25;25135:10;:8;:10::i;25121:25::-;25095:51;;25157:11;25171:39;25191:18;;25171:15;:19;;:39;;;;:::i;:::-;25157:53;;25221:11;25235:49;25268:15;25236:26;25257:4;25236:16;;:20;;:26;;;;:::i;22285:83::-;22326:42;22285:83;:::o;19840:151::-;19912:4;19929:32;19939:10;19951:2;19955:5;19929:9;:32::i;25513:355::-;25639:15;25686:1;25675:8;:12;25667:51;;;;;-1:-1:-1;;;25667:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25749:1;25737:9;:13;:30;;;;;25766:1;25754:9;:13;25737:30;25729:72;;;;;-1:-1:-1;;;25729:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25822:38;25850:9;25822:23;:8;25835:9;25822:12;:23::i;:::-;:27;;:38::i;:::-;25812:48;25513:355;-1:-1:-1;;;;25513:355:0:o;22140:49::-;22184:5;22140:49;:::o;22417:31::-;;;;:::o;22519:22::-;;;-1:-1:-1;;;;;22519:22:0;;:::o;22865:97::-;22745:7;;-1:-1:-1;;;;;22745:7:0;22731:10;:21;22723:53;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;;;;22940:5:::1;:14:::0;;-1:-1:-1;;;;;;22940:14:0::1;-1:-1:-1::0;;;;;22940:14:0;;;::::1;::::0;;;::::1;::::0;;22865:97::o;20476:561::-;20707:15;20695:8;:27;;20687:73;;;;-1:-1:-1;;;20687:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20855:13:0;;;20773:18;20855:13;;;:6;:13;;;;;;;;;20804:75;;16208:66;20804:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20794:86;;;;;;;;;20907:13;;;;;;20794:86;20907:20;;20925:1;20907:17;:20::i;:::-;-1:-1:-1;;;;;20891:13:0;;;;;;:6;:13;;;;;:36;20938:47;20898:5;20965:10;20977:1;20980;20983;20938:19;:47::i;:::-;20998:31;21007:5;21014:7;21023:5;20998:8;:31::i;:::-;20476:561;;;;;;;;:::o;24458:217::-;22745:7;;24572:19;;;;-1:-1:-1;;;;;22745:7:0;22731:10;:21;22723:53;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;;;;24655:12:::1;24660:6;24655:4;:12::i;:::-;24628:39:::0;;;;-1:-1:-1;24458:217:0;-1:-1:-1;;24458:217:0:o;16929:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;23831:619::-;22745:7;;24098:19;;;;;;-1:-1:-1;;;;;22745:7:0;22731:10;:21;22723:53;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;-1:-1:-1;;;22723:53:0;;;;;;;;;;;;;;;24236:71:::1;24250:12;24264:10;24276:15;24293:13;24236;:71::i;:::-;24209:98:::0;;-1:-1:-1;24209:98:0;-1:-1:-1;24330:51:0::1;24350:6:::0;24209:98;;24330:19:::1;:51::i;:::-;24318:63;;24392:50;24419:11;24432:9;24392:26;:50::i;:::-;23831:619:::0;;;;;;;;;:::o;21045:898::-;21342:10;21324:15;:28;21316:80;;;;-1:-1:-1;;;21316:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21433:11;21415:15;:29;21407:75;;;;-1:-1:-1;;;21407:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21502:24:0;;;;;;:18;:24;;;;;;;;:31;;;;;;;;;;;21501:32;21493:83;;;;-1:-1:-1;;;21493:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21634:97;;;16566:66;21634:97;;;;;;;;-1:-1:-1;;;;;21634:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21610:132;;;;;21753:46;21683:4;21610:132;21791:1;21794;21797;21753:19;:46::i;:::-;-1:-1:-1;;;;;21812:24:0;;;;;;:18;:24;;;;;;;;:31;;;;;;;;;:38;;-1:-1:-1;;21812:38:0;21846:4;21812:38;;;21866:30;21837:5;;21812:24;21866:30;;;21909:26;21919:4;21925:2;21929:5;21909:9;:26::i;:::-;21045:898;;;;;;;;;;:::o;17092:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19350:180::-;19401:7;15569:66;15758;15936;19493:12;:10;:12::i;:::-;19515:4;19438:83;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19438:83:0;;;;;;;;;;;;;;;;;;;;;;;;19428:94;;;;;;19421:101;;19350:180;:::o;22492:20::-;;;-1:-1:-1;;;;;22492:20:0;;:::o;18508:206::-;-1:-1:-1;;;;;18626:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;18675:31;;;;;;;;;;;;;;;;;18508:206;;;:::o;513:137::-;606:5;;;601:16;;;;593:49;;;;;-1:-1:-1;;;593:49:0;;;;;;;;;;;;-1:-1:-1;;;593:49:0;;;;;;;;;;;;;;18722:422;-1:-1:-1;;;;;18843:16:0;;18835:75;;;;-1:-1:-1;;;18835:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19018:15:0;;;;;;:9;:15;;;;;;:26;;19038:5;19018:19;:26::i;:::-;-1:-1:-1;;;;;19000:15:0;;;;;;;:9;:15;;;;;;:44;;;;19071:13;;;;;;;:24;;19089:5;19071:17;:24::i;:::-;-1:-1:-1;;;;;19055:13:0;;;;;;;:9;:13;;;;;;;;;:40;;;;19111:25;;;;;;;19055:13;;19111:25;;;;;;;;;;;;;18722:422;;;:::o;1123:263::-;1181:7;1213:1;1209;:5;1201:41;;;;;-1:-1:-1;;;1201:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1253:9;1269:1;1265;:5;;;;;;;1123:263;-1:-1:-1;;;;1123:263:0:o;658:457::-;716:7;961:6;957:47;;-1:-1:-1;991:1:0;984:8;;957:47;1028:5;;;1032:1;1028;:5;:1;1052:5;;;;;:10;1044:42;;;;;-1:-1:-1;;;1044:42:0;;;;;;;;;;;;-1:-1:-1;;;1044:42:0;;;;;;;;;;;;;;369:136;462:5;;;457:16;;;;449:48;;;;;-1:-1:-1;;;449:48:0;;;;;;;;;;;;-1:-1:-1;;;449:48:0;;;;;;;;;;;;;;18209:291;-1:-1:-1;;;;;18370:15:0;;;;;;:9;:15;;;;;;:26;;18390:5;18370:19;:26::i;:::-;-1:-1:-1;;;;;18352:15:0;;;;;;:9;:15;;;;;:44;;;;18421:11;:22;;18437:5;18421:15;:22::i;:::-;18407:11;:36;;;18459:33;;;;;;;;-1:-1:-1;;;;;18459:33:0;;;;;;;;;;;;;18209:291;;:::o;28808:210::-;28915:18;;:34;;28938:10;28915:22;:34::i;:::-;28894:18;:55;28979:16;;:31;;29000:9;28979:20;:31::i;:::-;28960:16;:50;-1:-1:-1;;28808:210:0:o;11715:211::-;11859:58;;;-1:-1:-1;;;;;11859:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11859:58:0;-1:-1:-1;;;11859:58:0;;;11832:86;;11852:5;;11832:19;:86::i;:::-;11715:211;;;:::o;28589:::-;28697:18;;:33;;28720:9;28697:22;:33::i;:::-;28676:18;:54;28760:16;;:32;;28781:10;28760:20;:32::i;17416:573::-;17589:14;17645:20;:18;:20::i;:::-;17667:10;17616:62;;;;;;-1:-1:-1;;;17616:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17606:73;;;;;;17589:90;;17690:24;17717:26;17727:6;17735:1;17738;17741;17717:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17717:26:0;;-1:-1:-1;;17717:26:0;;;-1:-1:-1;;;;;;;17878:30:0;;;;;;:60;;;17932:6;-1:-1:-1;;;;;17912:26:0;:16;-1:-1:-1;;;;;17912:26:0;;17878:60;17870:111;;;;-1:-1:-1;;;17870:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17416:573;;;;;;;:::o;25876:917::-;25924:19;25945:17;22585:8;;22597:1;22585:13;22577:38;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;-1:-1:-1;;;22577:38:0;;;;;;;;;;;;;;;22637:1;22626:8;:12;;;25998:44:::1;::::0;;-1:-1:-1;;;25998:44:0;;26036:4:::1;25998:44;::::0;::::1;::::0;;;22236:42:::1;::::0;25998:29:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;22236:42;25998:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25998:44:0;26081:5:::1;::::0;26074:38:::1;::::0;;-1:-1:-1;;;26074:38:0;;26106:4:::1;26074:38;::::0;::::1;::::0;;;25998:44;;-1:-1:-1;26053:18:0::1;::::0;-1:-1:-1;;;;;26081:5:0;;::::1;::::0;26074:23:::1;::::0;:38;;;;;25998:44:::1;::::0;26074:38;;;;;;;;26081:5;26074:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26074:38:0;26161:4:::1;26123:17;26143:24:::0;;;:9:::1;26074:38;26143:24:::0;;;;;26224:11;;26074:38;;-1:-1:-1;26143:24:0;26194:27:::1;26143:24:::0;26208:12;26194:13:::1;:27::i;:::-;:41;;;;;26286:11;::::0;26194:41;;::::1;::::0;-1:-1:-1;26258:25:0::1;:9:::0;26272:10;26258:13:::1;:25::i;:::-;:39;;;;;;26246:51;;26332:1;26318:11;:15;:32;;;;;26349:1;26337:9;:13;26318:32;26310:81;;;;-1:-1:-1::0;;;26310:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:31;26418:4;26425:9;26404:5;:31::i;:::-;26448:49;22236:42;26481:2:::0;26485:11;26448:32:::1;:49::i;:::-;26515:5;::::0;26508:41:::1;::::0;-1:-1:-1;;;;;26515:5:0::1;26535:2:::0;26539:9;26508:26:::1;:41::i;:::-;26594:44;::::0;;-1:-1:-1;;;26594:44:0;;26632:4:::1;26594:44;::::0;::::1;::::0;;;26577:62:::1;::::0;22236:42:::1;::::0;26594:29:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;22236:42;26594:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26594:44:0;26577:12;;:16:::1;:62::i;:::-;26685:5;::::0;26678:38:::1;::::0;;-1:-1:-1;;;26678:38:0;;26710:4:::1;26678:38;::::0;::::1;::::0;;;26562:77;;-1:-1:-1;26663:54:0::1;::::0;-1:-1:-1;;;;;26685:5:0;;::::1;::::0;26678:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;26685:5;26678:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26678:38:0;26663:10;;:14:::1;:54::i;:::-;26650:67;;26730:55;26760:12;26774:10;26730:29;:55::i;:::-;-1:-1:-1::0;;22672:1:0;22661:8;:12;-1:-1:-1;25876:917:0;;;;-1:-1:-1;25876:917:0:o;26801:1111::-;26979:19;27000:17;27034:16;;27054:1;27034:21;:48;;;;-1:-1:-1;27059:18:0;;:23;27034:48;27030:875;;;-1:-1:-1;27127:12:0;;-1:-1:-1;27141:10:0;27030:875;;;27185:22;27210:57;27216:12;27230:18;;27250:16;;27210:5;:57::i;:::-;27185:82;;27304:10;27286:14;:28;27282:612;;27361:13;27343:14;:31;;27335:72;;;;;-1:-1:-1;;;27335:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27454:12;;-1:-1:-1;27468:14:0;-1:-1:-1;27468:14:0;27282:612;;;27524:24;27551:55;27557:10;27569:16;;27587:18;;27551:5;:55::i;:::-;27524:82;;27676:12;27656:16;:32;;27655:75;;;;;27714:15;27694:16;:35;;27655:75;27625:177;;;;;-1:-1:-1;;;27625:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27849:16;-1:-1:-1;27867:10:0;;-1:-1:-1;27282:612:0;27030:875;;26801:1111;;;;;;;:::o;27920:661::-;28055:17;28089:11;;28085:384;;28134:66;22184:5;28134:43;28148:28;:12;28165:10;28148:16;:28::i;:::-;28134:13;:43::i;:::-;:47;;:66::i;:::-;28122:78;;28215:36;28229:1;22184:5;28215;:36::i;:::-;28085:384;;;28296:161;28359:18;;28327:29;28344:11;;28327:12;:16;;:29;;;;:::i;:::-;:50;;;;;;28426:16;;28396:27;28411:11;;28396:10;:14;;:27;;;;:::i;:::-;:46;;;;;;28296:12;:161::i;:::-;28284:173;;28085:384;28499:1;28487:9;:13;28479:62;;;;-1:-1:-1;;;28479:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28552:21;28558:3;28563:9;28552:5;:21::i;29026:224::-;29144:18;;:36;;29167:12;29144:22;:36::i;:::-;29123:18;:57;29210:16;;:32;;29231:10;29210:20;:32::i;12573:774::-;12997:23;13023:69;13051:4;13023:69;;;;;;;;;;;;;;;;;13031:5;-1:-1:-1;;;;;13023:27:0;;;:69;;;;;:::i;:::-;13107:17;;12997:95;;-1:-1:-1;13107:21:0;13103:237;;13262:10;13251:30;;;;;;;;;;;;;;;-1:-1:-1;13251:30:0;13243:85;;;;-1:-1:-1;;;13243:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29258:227;29379:18;;:36;;29402:12;29379:22;:36::i;1617:312::-;1665:9;1695:1;1691;:5;1687:235;;;-1:-1:-1;1717:1:0;1753;1749;1745:5;;:9;1769:92;1780:1;1776;:5;1769:92;;;1806:1;1802:5;;1844:1;1839;1835;1831;:5;;;;;;:9;1830:15;;;;;;1826:19;;1769:92;;;1687:235;;;;1882:6;;1878:44;;-1:-1:-1;1909:1:0;1617:312;;;:::o;17997:204::-;18073:11;;:22;;18089:5;18073:15;:22::i;:::-;18059:11;:36;;;-1:-1:-1;;;;;18122:13:0;;;;:9;:13;;;;;;:24;;18140:5;18122:17;:24::i;:::-;-1:-1:-1;;;;;18106:13:0;;;;;;:9;:13;;;;;;;;:40;;;;18162:31;;;;;;;18106:13;;;;18162:31;;;;;;;;;;17997:204;;:::o;1394:105::-;1452:9;1482:1;1478;:5;:13;;1490:1;1478:13;;;-1:-1:-1;1486:1:0;;1474:17;-1:-1:-1;1394:105:0:o;6522:229::-;6659:12;6691:52;6713:6;6721:4;6727:1;6730:12;6659;7937:18;7948:6;7937:10;:18::i;:::-;7929:60;;;;;-1:-1:-1;;;7929:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8063:12;8077:23;8104:6;-1:-1:-1;;;;;8104:11:0;8124:5;8132:4;8104:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8104:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8062:75;;;;8155:52;8173:7;8182:10;8194:12;8155:17;:52::i;:::-;8148:59;7642:573;-1:-1:-1;;;;;;;7642:573:0:o;3580:444::-;3960:20;4008:8;;;3580:444::o;10293:777::-;10443:12;10472:7;10468:595;;;-1:-1:-1;10503:10:0;10496:17;;10468:595;10617:17;;:21;10613:439;;10880:10;10874:17;10941:15;10928:10;10924:2;10920:19;10913:44;10828:148;11023:12;11016:20;;-1:-1:-1;;;11016:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://9683472579f7daa8f010c335cb11c4719f0438a7518f90532d9eeb74d4a68584
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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