POL Price: $0.364226 (-2.22%)
 

Overview

Max Total Supply

11,931,583.823054914594461533 SCA

Holders

2,208 ( -1.902%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 POL

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Scaleswap is an IDO launchpad providing features and a vastly improved IDO experience for users. They aim to make excessive gas fees a thing of the past, and reimagining community appreciation and governance through a scoring system that rewards loyalty and participation – the ScaleSCORE.

Contract Source Code Verified (Exact Match)

Contract Name:
ScaleSwapToken

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-21
*/

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract EIP712Base {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    constructor(string memory name) {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        return block.chainid;
    }

    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

abstract contract NativeMetaTransaction is EIP712Base {
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress] + 1;

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context is ContextMixin {
    function _msgSender() internal view virtual returns (address) {
        return msgSender();
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is NativeMetaTransaction, Context, IERC20 {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) EIP712Base(name_) public {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overloaded;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
    public
    view
    virtual
    override
    returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// Exempt from the original UniswapV2Library.
library UniswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(bytes32 initCodeHash, address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                initCodeHash // init code hash
            )))));
    }
}

/// @notice based on https://github.com/Uniswap/uniswap-v3-periphery/blob/v1.0.0/contracts/libraries/PoolAddress.sol
/// @notice changed compiler version and lib name.

/// @title Provides functions for deriving a pool address from the factory, tokens, and the fee
library UniswapV3Library {
    bytes32 internal constant POOL_INIT_CODE_HASH = 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54;

    /// @notice The identifying key of the pool
    struct PoolKey {
        address token0;
        address token1;
        uint24 fee;
    }

    /// @notice Returns PoolKey: the ordered tokens with the matched fee levels
    /// @param tokenA The first token of a pool, unsorted
    /// @param tokenB The second token of a pool, unsorted
    /// @param fee The fee level of the pool
    /// @return Poolkey The pool details with ordered token0 and token1 assignments
    function getPoolKey(
        address tokenA,
        address tokenB,
        uint24 fee
    ) internal pure returns (PoolKey memory) {
        if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA);
        return PoolKey({token0: tokenA, token1: tokenB, fee: fee});
    }

    /// @notice Deterministically computes the pool address given the factory and PoolKey
    /// @param factory The Uniswap V3 factory contract address
    /// @param key The PoolKey
    /// @return pool The contract address of the V3 pool
    function computeAddress(address factory, PoolKey memory key) internal pure returns (address pool) {
        require(key.token0 < key.token1);
        pool = address(
            uint160(uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encode(key.token0, key.token1, key.fee)),
                        POOL_INIT_CODE_HASH
                    )
                )
            ))
        );
    }
}

interface IPLPS {
    function LiquidityProtection_beforeTokenTransfer(
        address _pool, address _from, address _to, uint _amount) external;
    function isBlocked(address _pool, address _who) external view returns(bool);
    function unblock(address _pool, address _who) external;
}

abstract contract UsingLiquidityProtectionService {
    bool private protected = true;
    uint64 internal constant HUNDRED_PERCENT = 1e18;
    bytes32 internal constant UNISWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;
    bytes32 internal constant PANCAKESWAP = 0x00fb7f630766e6a796048ea87d01acd3068e8ff67d078148a3fa3f4a84f69bd5;
    bytes32 internal constant QUICKSWAP = 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f;

    enum UniswapVersion {
        V2,
        V3
    }

    enum UniswapV3Fees {
        _005, // 0.05%
        _03, // 0.3%
        _1 // 1%
    }

    modifier onlyProtectionAdmin() {
        protectionAdminCheck();
        _;
    }

    function token_transfer(address from, address to, uint amount) internal virtual;
    function token_balanceOf(address holder) internal view virtual returns(uint);
    function protectionAdminCheck() internal view virtual;
    function liquidityProtectionService() internal pure virtual returns(address);
    function uniswapVariety() internal pure virtual returns(bytes32);
    function uniswapVersion() internal pure virtual returns(UniswapVersion);
    function uniswapFactory() internal pure virtual returns(address);
    function counterToken() internal pure virtual returns(address) {
        return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // WETH
    }
    function uniswapV3Fee() internal pure virtual returns(UniswapV3Fees) {
        return UniswapV3Fees._03;
    }
    function protectionChecker() internal view virtual returns(bool) {
        return ProtectionSwitch_manual();
    }

    function lps() private pure returns(IPLPS) {
        return IPLPS(liquidityProtectionService());
    }

    function LiquidityProtection_beforeTokenTransfer(address _from, address _to, uint _amount) internal virtual {
        if (protectionChecker()) {
            if (!protected) {
                return;
            }
            lps().LiquidityProtection_beforeTokenTransfer(getLiquidityPool(), _from, _to, _amount);
        }
    }

    function revokeBlocked(address[] calldata _holders, address _revokeTo) external onlyProtectionAdmin() {
        require(protectionChecker(), 'UsingLiquidityProtectionService: protection removed');
        protected = false;
        address pool = getLiquidityPool();
        for (uint i = 0; i < _holders.length; i++) {
            address holder = _holders[i];
            if (lps().isBlocked(pool, holder)) {
                token_transfer(holder, _revokeTo, token_balanceOf(holder));
            }
        }
        protected = true;
    }

    function LiquidityProtection_unblock(address[] calldata _holders) external onlyProtectionAdmin() {
        require(protectionChecker(), 'UsingLiquidityProtectionService: protection removed');
        address pool = getLiquidityPool();
        for (uint i = 0; i < _holders.length; i++) {
            lps().unblock(pool, _holders[i]);
        }
    }

    function disableProtection() external onlyProtectionAdmin() {
        protected = false;
    }

    function isProtected() public view returns(bool) {
        return protected;
    }

    function ProtectionSwitch_manual() internal view returns(bool) {
        return protected;
    }

    function ProtectionSwitch_timestamp(uint _timestamp) internal view returns(bool) {
        return not(passed(_timestamp));
    }

    function ProtectionSwitch_block(uint _block) internal view returns(bool) {
        return not(blockPassed(_block));
    }

    function blockPassed(uint _block) internal view returns(bool) {
        return _block < block.number;
    }

    function passed(uint _timestamp) internal view returns(bool) {
        return _timestamp < block.timestamp;
    }

    function not(bool _condition) internal pure returns(bool) {
        return !_condition;
    }

    function feeToUint24(UniswapV3Fees _fee) internal pure returns(uint24) {
        if (_fee == UniswapV3Fees._03) return 3000;
        if (_fee == UniswapV3Fees._005) return 500;
        return 10000;
    }

    function getLiquidityPool() public view returns(address) {
        if (uniswapVersion() == UniswapVersion.V2) {
            return UniswapV2Library.pairFor(uniswapVariety(), uniswapFactory(), address(this), counterToken());
        }
        require(uniswapVariety() == UNISWAP, 'LiquidityProtection: uniswapVariety() can only be UNISWAP for V3.');
        return UniswapV3Library.computeAddress(uniswapFactory(),
            UniswapV3Library.getPoolKey(address(this), counterToken(), feeToUint24(uniswapV3Fee())));
    }
}


contract ScaleSwapToken is ERC20Burnable, Ownable, UsingLiquidityProtectionService {
    function token_transfer(address _from, address _to, uint _amount) internal override {
        _transfer(_from, _to, _amount); // Expose low-level token transfer function.
    }
    function token_balanceOf(address _holder) internal view override returns(uint) {
        return balanceOf(_holder); // Expose balance check function.
    }
    function protectionAdminCheck() internal view override onlyOwner {} // Must revert to deny access.
    function liquidityProtectionService() internal pure override returns(address) {
        return 0x0d0e7c27D25160231A4ce475CB9b296A41Aea329;
    }
    function uniswapVariety() internal pure override returns(bytes32) {
        return QUICKSWAP; // UNISWAP / PANCAKESWAP / QUICKSWAP.
    }
    function uniswapVersion() internal pure override returns(UniswapVersion) {
        return UniswapVersion.V2; // V2 or V3.
    }
    function uniswapFactory() internal pure override returns(address) {
        return 0x5757371414417b8C6CAad45bAeF941aBc7d3Ab32;
    }
    function _beforeTokenTransfer(address _from, address _to, uint _amount) internal override {
        super._beforeTokenTransfer(_from, _to, _amount);
        LiquidityProtection_beforeTokenTransfer(_from, _to, _amount);
    }
    // All the following overrides are optional, if you want to modify default behavior.

    // How the protection gets disabled.
    function protectionChecker() internal view override returns(bool) {
        return ProtectionSwitch_timestamp(1626998399); // Switch off protection on Thursday, July 22, 2021 11:59:59 PM GTM.
        // return ProtectionSwitch_block(13000000); // Switch off protection on block 13000000.
//        return ProtectionSwitch_manual(); // Switch off protection by calling disableProtection(); from owner. Default.
    }

    // This token will be pooled in pair with:
    function counterToken() internal pure override returns(address) {
        return 0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619; // WETH
    }

    function updateChildChainManager(address newChildChainManagerProxy) external onlyOwner {
        require(newChildChainManagerProxy != address(0), "Bad ChildChainManagerProxy address");
        childChainManagerProxy = newChildChainManagerProxy;
    }

    function deposit(address user, bytes calldata depositData) external {
        require(msg.sender == childChainManagerProxy, "You're not allowed to deposit");
        uint256 amount = abi.decode(depositData, (uint256));
        _mint(user, amount);
    }

    function withdraw(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    address public childChainManagerProxy;

    constructor() ERC20('ScaleSwapToken', 'SCA') {
        childChainManagerProxy = 0xA6FA4fB5f76172d178d61B04b0ecd319C5d1C0aa;
    }
}

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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"}],"name":"LiquidityProtection_unblock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childChainManagerProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"address","name":"_revokeTo","type":"address"}],"name":"revokeBlocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newChildChainManagerProxy","type":"address"}],"name":"updateChildChainManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040518060400160405280600e81526020016d29b1b0b632a9bbb0b82a37b5b2b760911b8152506040518060400160405280600381526020016253434160e81b815250816040518060800160405280604f81526020016200242e604f913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc630620000d7620001db565b60408051602081019690965285019390935260608401919091526001600160a01b0316608083015260a082015260c00160408051601f19818403018152919052805160209182012060005583516200013692506005918501906200024f565b5080516200014c9060069060208401906200024f565b505050600062000161620001e060201b60201c565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600880546001600160a01b03191673a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa17905562000332565b465b90565b6000620001ec620001f1565b905090565b6000333014156200024a57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620001dd9050565b503390565b8280546200025d90620002f5565b90600052602060002090601f016020900481019282620002815760008555620002cc565b82601f106200029c57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cc578251825591602001919060010190620002af565b50620002da929150620002de565b5090565b5b80821115620002da5760008155600101620002df565b600181811c908216806200030a57607f821691505b602082108114156200032c57634e487b7160e01b600052602260045260246000fd5b50919050565b6120ec80620003426000396000f3fe6080604052600436106101c25760003560e01c80635300f82b116100f75780638da5cb5b11610095578063a9059cbb11610064578063a9059cbb146104da578063cf2c52cb146104fa578063dd62ed3e1461051a578063f2fde38b14610560576101c2565b80638da5cb5b1461047257806395d89b411461049057806395ddbe89146104a5578063a457c2d7146104ba576101c2565b806370a08231116100d157806370a08231146103fd578063715018a61461041d57806375ee83891461043257806379cc679014610452576101c2565b80635300f82b146103855780635fdb86f9146103a557806362f629e7146103c5576101c2565b80632e1a7d4d11610164578063395093511161013e5780633950935114610310578063421dd7c71461033057806342966c6814610345578063445a679714610365576101c2565b80632e1a7d4d146102bf578063313ce567146102e15780633408e470146102fd576101c2565b806318160ddd116101a057806318160ddd1461023557806320379ee51461025457806323b872dd146102695780632d0335ab14610289576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630c53c51c14610222575b600080fd5b3480156101d357600080fd5b506101dc610580565b6040516101e99190611efb565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004611d59565b610613565b60405190151581526020016101e9565b6101dc610230366004611c7a565b610630565b34801561024157600080fd5b506004545b6040519081526020016101e9565b34801561026057600080fd5b50600054610246565b34801561027557600080fd5b50610212610284366004611bc1565b610820565b34801561029557600080fd5b506102466102a4366004611b6e565b6001600160a01b031660009081526001602052604090205490565b3480156102cb57600080fd5b506102df6102da366004611e34565b6108f8565b005b3480156102ed57600080fd5b50604051601281526020016101e9565b34801561030957600080fd5b5046610246565b34801561031c57600080fd5b5061021261032b366004611d59565b610905565b34801561033c57600080fd5b506102df610954565b34801561035157600080fd5b506102df610360366004611e34565b61096b565b34801561037157600080fd5b506102df610380366004611b6e565b61097c565b34801561039157600080fd5b50610212600754600160a01b900460ff1690565b3480156103b157600080fd5b506102df6103c0366004611d82565b610a48565b3480156103d157600080fd5b506008546103e5906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b34801561040957600080fd5b50610246610418366004611b6e565b610b50565b34801561042957600080fd5b506102df610b6f565b34801561043e57600080fd5b506102df61044d366004611dc2565b610c02565b34801561045e57600080fd5b506102df61046d366004611d59565b610d5b565b34801561047e57600080fd5b506007546001600160a01b03166103e5565b34801561049c57600080fd5b506101dc610dec565b3480156104b157600080fd5b506103e5610dfb565b3480156104c657600080fd5b506102126104d5366004611d59565b610e5d565b3480156104e657600080fd5b506102126104f5366004611d59565b610f16565b34801561050657600080fd5b506102df610515366004611bfc565b610f2a565b34801561052657600080fd5b50610246610535366004611b8f565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561056c57600080fd5b506102df61057b366004611b6e565b610f9e565b60606005805461058f90611ff1565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb90611ff1565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b505050505090505b90565b60006106276106206110a8565b84846110b2565b50600192915050565b60408051606081810183526001600160a01b0388166000818152600160209081529085902054845283015291810186905261066e87828787876111d7565b6106c95760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084015b60405180910390fd5b6001600160a01b0387166000908152600160208190526040909120546106ee91611f96565b6001600160a01b0388166000908152600160205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061073e90899033908a90611ec6565b60405180910390a1600080306001600160a01b0316888a604051602001610766929190611e94565b60408051601f198184030181529082905261078091611e78565b6000604051808303816000865af19150503d80600081146107bd576040519150601f19603f3d011682016040523d82523d6000602084013e6107c2565b606091505b5091509150816108145760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016106c0565b98975050505050505050565b600061082d8484846112c7565b6001600160a01b03841660009081526003602052604081208161084e6110a8565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156108d25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106c0565b6108ed856108de6110a8565b6108e88685611fae565b6110b2565b506001949350505050565b61090233826114aa565b50565b60006106276109126110a8565b8484600360006109206110a8565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108e89190611f96565b61095c611605565b6007805460ff60a01b19169055565b6109026109766110a8565b826114aa565b6109846110a8565b6001600160a01b031661099f6007546001600160a01b031690565b6001600160a01b0316146109c55760405162461bcd60e51b81526004016106c090611f61565b6001600160a01b038116610a265760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f7879206164647265604482015261737360f01b60648201526084016106c0565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b610a50611605565b610a58611650565b610a745760405162461bcd60e51b81526004016106c090611f0e565b6000610a7e610dfb565b905060005b82811015610b4a57610a9361165f565b6001600160a01b0316630d8bd5e883868685818110610ac257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ad79190611b6e565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505050508080610b429061202c565b915050610a83565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b610b776110a8565b6001600160a01b0316610b926007546001600160a01b031690565b6001600160a01b031614610bb85760405162461bcd60e51b81526004016106c090611f61565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b610c0a611605565b610c12611650565b610c2e5760405162461bcd60e51b81526004016106c090611f0e565b6007805460ff60a01b191690556000610c45610dfb565b905060005b83811015610d41576000858583818110610c7457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c899190611b6e565b9050610c9361165f565b604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b158015610cde57600080fd5b505afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611e14565b15610d2e57610d2e8185610d298461167b565b61168c565b5080610d398161202c565b915050610c4a565b50506007805460ff60a01b1916600160a01b179055505050565b6000610d69836105356110a8565b905081811015610dc75760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016106c0565b610ddd83610dd36110a8565b6108e88585611fae565b610de783836114aa565b505050565b60606006805461058f90611ff1565b6000610e517f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735757371414417b8c6caad45baef941abc7d3ab3230737ceb23fd6bc0add59e62ac25578270cff1b9f619611697565b9050610610565b905090565b60008060036000610e6c6110a8565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610ef65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106c0565b610f0c610f016110a8565b856108e88685611fae565b5060019392505050565b6000610627610f236110a8565b84846112c7565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820152601d60248201527f596f75277265206e6f7420616c6c6f77656420746f206465706f73697400000060448201526064016106c0565b6000610f9282840184611e34565b9050610b4a848261174b565b610fa66110a8565b6001600160a01b0316610fc16007546001600160a01b031690565b6001600160a01b031614610fe75760405162461bcd60e51b81526004016106c090611f61565b6001600160a01b03811661104c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c0565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e58611836565b6001600160a01b0383166111145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106c0565b6001600160a01b0382166111755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106c0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006001600160a01b03861661123d5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016106c0565b600161125061124b87611892565b61190f565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561129e573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6001600160a01b03831661132b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106c0565b6001600160a01b03821661138d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106c0565b611398838383611938565b6001600160a01b038316600090815260026020526040902054818110156114105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106c0565b61141a8282611fae565b6001600160a01b038086166000908152600260205260408082209390935590851681529081208054849290611450908490611f96565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161149c91815260200190565b60405180910390a350505050565b6001600160a01b03821661150a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106c0565b61151682600083611938565b6001600160a01b0382166000908152600260205260409020548181101561158a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106c0565b6115948282611fae565b6001600160a01b038416600090815260026020526040812091909155600480548492906115c2908490611fae565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111ca565b61160d6110a8565b6001600160a01b03166116286007546001600160a01b031690565b6001600160a01b03161461164e5760405162461bcd60e51b81526004016106c090611f61565b565b6000610e586360fa067f611943565b6000730d0e7c27d25160231a4ce475cb9b296a41aea329610e58565b600061168682610b50565b92915050565b610de78383836112c7565b60008060006116a68585611955565b6040516001600160601b0319606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001611728939291906001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b60408051601f198184030181529190528051602090910120979650505050505050565b6001600160a01b0382166117a15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106c0565b6117ad60008383611938565b80600460008282546117bf9190611f96565b90915550506001600160a01b038216600090815260026020526040812080548392906117ec908490611f96565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60003330141561188d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506106109050565b503390565b600060405180608001604052806043815260200161207460439139805160209182012083518483015160408087015180519086012090516118f2950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000805460405161190160f01b60208201526022810191909152604281018390526062016118f2565b610de7838383611a4d565b600061168661195183421190565b1590565b600080826001600160a01b0316846001600160a01b031614156119c85760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016106c0565b826001600160a01b0316846001600160a01b0316106119e85782846119eb565b83835b90925090506001600160a01b038216611a465760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016106c0565b9250929050565b611a55611650565b15610de757600754600160a01b900460ff16611a7057610de7565b611a7861165f565b6001600160a01b0316630336a330611a8e610dfb565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b158015611ae657600080fd5b505af1158015611afa573d6000803e3d6000fd5b50505050505050565b80356001600160a01b0381168114610b6a57600080fd5b60008083601f840112611b2b578081fd5b50813567ffffffffffffffff811115611b42578182fd5b6020830191508360208260051b8501011115611a4657600080fd5b803560ff81168114610b6a57600080fd5b600060208284031215611b7f578081fd5b611b8882611b03565b9392505050565b60008060408385031215611ba1578081fd5b611baa83611b03565b9150611bb860208401611b03565b90509250929050565b600080600060608486031215611bd5578081fd5b611bde84611b03565b9250611bec60208501611b03565b9150604084013590509250925092565b600080600060408486031215611c10578283fd5b611c1984611b03565b9250602084013567ffffffffffffffff80821115611c35578384fd5b818601915086601f830112611c48578384fd5b813581811115611c56578485fd5b876020828501011115611c67578485fd5b6020830194508093505050509250925092565b600080600080600060a08688031215611c91578081fd5b611c9a86611b03565b9450602086013567ffffffffffffffff80821115611cb6578283fd5b818801915088601f830112611cc9578283fd5b813581811115611cdb57611cdb61205d565b604051601f8201601f19908116603f01168101908382118183101715611d0357611d0361205d565b816040528281528b6020848701011115611d1b578586fd5b8260208601602083013791820160200185905250955050506040860135925060608601359150611d4d60808701611b5d565b90509295509295909350565b60008060408385031215611d6b578182fd5b611d7483611b03565b946020939093013593505050565b60008060208385031215611d94578182fd5b823567ffffffffffffffff811115611daa578283fd5b611db685828601611b1a565b90969095509350505050565b600080600060408486031215611dd6578283fd5b833567ffffffffffffffff811115611dec578384fd5b611df886828701611b1a565b9094509250611e0b905060208501611b03565b90509250925092565b600060208284031215611e25578081fd5b81518015158114611b88578182fd5b600060208284031215611e45578081fd5b5035919050565b60008151808452611e64816020860160208601611fc5565b601f01601f19169290920160200192915050565b60008251611e8a818460208701611fc5565b9190910192915050565b60008351611ea6818460208801611fc5565b60609390931b6001600160601b0319169190920190815260140192915050565b6001600160a01b03848116825283166020820152606060408201819052600090611ef290830184611e4c565b95945050505050565b600060208252611b886020830184611e4c565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611fa957611fa9612047565b500190565b600082821015611fc057611fc0612047565b500390565b60005b83811015611fe0578181015183820152602001611fc8565b83811115610b4a5750506000910152565b600181811c9082168061200557607f821691505b6020821081141561202657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561204057612040612047565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a179aecc73e90718f39b5d2ec902066731687118a1f146a225313db2d11aba2a64736f6c63430008030033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80635300f82b116100f75780638da5cb5b11610095578063a9059cbb11610064578063a9059cbb146104da578063cf2c52cb146104fa578063dd62ed3e1461051a578063f2fde38b14610560576101c2565b80638da5cb5b1461047257806395d89b411461049057806395ddbe89146104a5578063a457c2d7146104ba576101c2565b806370a08231116100d157806370a08231146103fd578063715018a61461041d57806375ee83891461043257806379cc679014610452576101c2565b80635300f82b146103855780635fdb86f9146103a557806362f629e7146103c5576101c2565b80632e1a7d4d11610164578063395093511161013e5780633950935114610310578063421dd7c71461033057806342966c6814610345578063445a679714610365576101c2565b80632e1a7d4d146102bf578063313ce567146102e15780633408e470146102fd576101c2565b806318160ddd116101a057806318160ddd1461023557806320379ee51461025457806323b872dd146102695780632d0335ab14610289576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630c53c51c14610222575b600080fd5b3480156101d357600080fd5b506101dc610580565b6040516101e99190611efb565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004611d59565b610613565b60405190151581526020016101e9565b6101dc610230366004611c7a565b610630565b34801561024157600080fd5b506004545b6040519081526020016101e9565b34801561026057600080fd5b50600054610246565b34801561027557600080fd5b50610212610284366004611bc1565b610820565b34801561029557600080fd5b506102466102a4366004611b6e565b6001600160a01b031660009081526001602052604090205490565b3480156102cb57600080fd5b506102df6102da366004611e34565b6108f8565b005b3480156102ed57600080fd5b50604051601281526020016101e9565b34801561030957600080fd5b5046610246565b34801561031c57600080fd5b5061021261032b366004611d59565b610905565b34801561033c57600080fd5b506102df610954565b34801561035157600080fd5b506102df610360366004611e34565b61096b565b34801561037157600080fd5b506102df610380366004611b6e565b61097c565b34801561039157600080fd5b50610212600754600160a01b900460ff1690565b3480156103b157600080fd5b506102df6103c0366004611d82565b610a48565b3480156103d157600080fd5b506008546103e5906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b34801561040957600080fd5b50610246610418366004611b6e565b610b50565b34801561042957600080fd5b506102df610b6f565b34801561043e57600080fd5b506102df61044d366004611dc2565b610c02565b34801561045e57600080fd5b506102df61046d366004611d59565b610d5b565b34801561047e57600080fd5b506007546001600160a01b03166103e5565b34801561049c57600080fd5b506101dc610dec565b3480156104b157600080fd5b506103e5610dfb565b3480156104c657600080fd5b506102126104d5366004611d59565b610e5d565b3480156104e657600080fd5b506102126104f5366004611d59565b610f16565b34801561050657600080fd5b506102df610515366004611bfc565b610f2a565b34801561052657600080fd5b50610246610535366004611b8f565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561056c57600080fd5b506102df61057b366004611b6e565b610f9e565b60606005805461058f90611ff1565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb90611ff1565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b505050505090505b90565b60006106276106206110a8565b84846110b2565b50600192915050565b60408051606081810183526001600160a01b0388166000818152600160209081529085902054845283015291810186905261066e87828787876111d7565b6106c95760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084015b60405180910390fd5b6001600160a01b0387166000908152600160208190526040909120546106ee91611f96565b6001600160a01b0388166000908152600160205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061073e90899033908a90611ec6565b60405180910390a1600080306001600160a01b0316888a604051602001610766929190611e94565b60408051601f198184030181529082905261078091611e78565b6000604051808303816000865af19150503d80600081146107bd576040519150601f19603f3d011682016040523d82523d6000602084013e6107c2565b606091505b5091509150816108145760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016106c0565b98975050505050505050565b600061082d8484846112c7565b6001600160a01b03841660009081526003602052604081208161084e6110a8565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156108d25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106c0565b6108ed856108de6110a8565b6108e88685611fae565b6110b2565b506001949350505050565b61090233826114aa565b50565b60006106276109126110a8565b8484600360006109206110a8565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108e89190611f96565b61095c611605565b6007805460ff60a01b19169055565b6109026109766110a8565b826114aa565b6109846110a8565b6001600160a01b031661099f6007546001600160a01b031690565b6001600160a01b0316146109c55760405162461bcd60e51b81526004016106c090611f61565b6001600160a01b038116610a265760405162461bcd60e51b815260206004820152602260248201527f426164204368696c64436861696e4d616e6167657250726f7879206164647265604482015261737360f01b60648201526084016106c0565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b610a50611605565b610a58611650565b610a745760405162461bcd60e51b81526004016106c090611f0e565b6000610a7e610dfb565b905060005b82811015610b4a57610a9361165f565b6001600160a01b0316630d8bd5e883868685818110610ac257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ad79190611b6e565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505050508080610b429061202c565b915050610a83565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b610b776110a8565b6001600160a01b0316610b926007546001600160a01b031690565b6001600160a01b031614610bb85760405162461bcd60e51b81526004016106c090611f61565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b610c0a611605565b610c12611650565b610c2e5760405162461bcd60e51b81526004016106c090611f0e565b6007805460ff60a01b191690556000610c45610dfb565b905060005b83811015610d41576000858583818110610c7457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c899190611b6e565b9050610c9361165f565b604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b158015610cde57600080fd5b505afa158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611e14565b15610d2e57610d2e8185610d298461167b565b61168c565b5080610d398161202c565b915050610c4a565b50506007805460ff60a01b1916600160a01b179055505050565b6000610d69836105356110a8565b905081811015610dc75760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016106c0565b610ddd83610dd36110a8565b6108e88585611fae565b610de783836114aa565b505050565b60606006805461058f90611ff1565b6000610e517f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735757371414417b8c6caad45baef941abc7d3ab3230737ceb23fd6bc0add59e62ac25578270cff1b9f619611697565b9050610610565b905090565b60008060036000610e6c6110a8565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610ef65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106c0565b610f0c610f016110a8565b856108e88685611fae565b5060019392505050565b6000610627610f236110a8565b84846112c7565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820152601d60248201527f596f75277265206e6f7420616c6c6f77656420746f206465706f73697400000060448201526064016106c0565b6000610f9282840184611e34565b9050610b4a848261174b565b610fa66110a8565b6001600160a01b0316610fc16007546001600160a01b031690565b6001600160a01b031614610fe75760405162461bcd60e51b81526004016106c090611f61565b6001600160a01b03811661104c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c0565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e58611836565b6001600160a01b0383166111145760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106c0565b6001600160a01b0382166111755760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106c0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006001600160a01b03861661123d5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016106c0565b600161125061124b87611892565b61190f565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561129e573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6001600160a01b03831661132b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106c0565b6001600160a01b03821661138d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106c0565b611398838383611938565b6001600160a01b038316600090815260026020526040902054818110156114105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106c0565b61141a8282611fae565b6001600160a01b038086166000908152600260205260408082209390935590851681529081208054849290611450908490611f96565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161149c91815260200190565b60405180910390a350505050565b6001600160a01b03821661150a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106c0565b61151682600083611938565b6001600160a01b0382166000908152600260205260409020548181101561158a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106c0565b6115948282611fae565b6001600160a01b038416600090815260026020526040812091909155600480548492906115c2908490611fae565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111ca565b61160d6110a8565b6001600160a01b03166116286007546001600160a01b031690565b6001600160a01b03161461164e5760405162461bcd60e51b81526004016106c090611f61565b565b6000610e586360fa067f611943565b6000730d0e7c27d25160231a4ce475cb9b296a41aea329610e58565b600061168682610b50565b92915050565b610de78383836112c7565b60008060006116a68585611955565b6040516001600160601b0319606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001611728939291906001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b60408051601f198184030181529190528051602090910120979650505050505050565b6001600160a01b0382166117a15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106c0565b6117ad60008383611938565b80600460008282546117bf9190611f96565b90915550506001600160a01b038216600090815260026020526040812080548392906117ec908490611f96565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60003330141561188d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506106109050565b503390565b600060405180608001604052806043815260200161207460439139805160209182012083518483015160408087015180519086012090516118f2950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000805460405161190160f01b60208201526022810191909152604281018390526062016118f2565b610de7838383611a4d565b600061168661195183421190565b1590565b600080826001600160a01b0316846001600160a01b031614156119c85760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016106c0565b826001600160a01b0316846001600160a01b0316106119e85782846119eb565b83835b90925090506001600160a01b038216611a465760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016106c0565b9250929050565b611a55611650565b15610de757600754600160a01b900460ff16611a7057610de7565b611a7861165f565b6001600160a01b0316630336a330611a8e610dfb565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b158015611ae657600080fd5b505af1158015611afa573d6000803e3d6000fd5b50505050505050565b80356001600160a01b0381168114610b6a57600080fd5b60008083601f840112611b2b578081fd5b50813567ffffffffffffffff811115611b42578182fd5b6020830191508360208260051b8501011115611a4657600080fd5b803560ff81168114610b6a57600080fd5b600060208284031215611b7f578081fd5b611b8882611b03565b9392505050565b60008060408385031215611ba1578081fd5b611baa83611b03565b9150611bb860208401611b03565b90509250929050565b600080600060608486031215611bd5578081fd5b611bde84611b03565b9250611bec60208501611b03565b9150604084013590509250925092565b600080600060408486031215611c10578283fd5b611c1984611b03565b9250602084013567ffffffffffffffff80821115611c35578384fd5b818601915086601f830112611c48578384fd5b813581811115611c56578485fd5b876020828501011115611c67578485fd5b6020830194508093505050509250925092565b600080600080600060a08688031215611c91578081fd5b611c9a86611b03565b9450602086013567ffffffffffffffff80821115611cb6578283fd5b818801915088601f830112611cc9578283fd5b813581811115611cdb57611cdb61205d565b604051601f8201601f19908116603f01168101908382118183101715611d0357611d0361205d565b816040528281528b6020848701011115611d1b578586fd5b8260208601602083013791820160200185905250955050506040860135925060608601359150611d4d60808701611b5d565b90509295509295909350565b60008060408385031215611d6b578182fd5b611d7483611b03565b946020939093013593505050565b60008060208385031215611d94578182fd5b823567ffffffffffffffff811115611daa578283fd5b611db685828601611b1a565b90969095509350505050565b600080600060408486031215611dd6578283fd5b833567ffffffffffffffff811115611dec578384fd5b611df886828701611b1a565b9094509250611e0b905060208501611b03565b90509250925092565b600060208284031215611e25578081fd5b81518015158114611b88578182fd5b600060208284031215611e45578081fd5b5035919050565b60008151808452611e64816020860160208601611fc5565b601f01601f19169290920160200192915050565b60008251611e8a818460208701611fc5565b9190910192915050565b60008351611ea6818460208801611fc5565b60609390931b6001600160601b0319169190920190815260140192915050565b6001600160a01b03848116825283166020820152606060408201819052600090611ef290830184611e4c565b95945050505050565b600060208252611b886020830184611e4c565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611fa957611fa9612047565b500190565b600082821015611fc057611fc0612047565b500390565b60005b83811015611fe0578181015183820152602001611fc8565b83811115610b4a5750506000910152565b600181811c9082168061200557607f821691505b6020821081141561202657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561204057612040612047565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a179aecc73e90718f39b5d2ec902066731687118a1f146a225313db2d11aba2a64736f6c63430008030033

Deployed Bytecode Sourcemap

31134:2904:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10805:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12975:169;;;;;;;;;;-1:-1:-1;12975:169:0;;;;;:::i;:::-;;:::i;:::-;;;9481:14:1;;9474:22;9456:41;;9444:2;9429:18;12975:169:0;9411:92:1;5058:1148:0;;;;;;:::i;:::-;;:::i;11898:108::-;;;;;;;;;;-1:-1:-1;11986:12:0;;11898:108;;;9654:25:1;;;9642:2;9627:18;11898:108:0;9609:76:1;3762:101:0;;;;;;;;;;-1:-1:-1;3813:7:0;3840:15;3762:101;;13626:456;;;;;;;;;;-1:-1:-1;13626:456:0;;;;;:::i;:::-;;:::i;6632:107::-;;;;;;;;;;-1:-1:-1;6632:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;6719:12:0;6685:13;6719:12;;;:6;:12;;;;;;;6632:107;33763:87;;;;;;;;;;-1:-1:-1;33763:87:0;;;;;:::i;:::-;;:::i;:::-;;11749:84;;;;;;;;;;-1:-1:-1;11749:84:0;;11823:2;20048:36:1;;20036:2;20021:18;11749:84:0;20003:87:1;3871:91:0;;;;;;;;;;-1:-1:-1;3941:13:0;3871:91;;14491:215;;;;;;;;;;-1:-1:-1;14491:215:0;;;;;:::i;:::-;;:::i;29467:96::-;;;;;;;;;;;;;:::i;20113:91::-;;;;;;;;;;-1:-1:-1;20113:91:0;;;;;:::i;:::-;;:::i;33237:253::-;;;;;;;;;;-1:-1:-1;33237:253:0;;;;;:::i;:::-;;:::i;29571:84::-;;;;;;;;;;;;29638:9;;-1:-1:-1;;;29638:9:0;;;;;29571:84;29104:355;;;;;;;;;;-1:-1:-1;29104:355:0;;;;;:::i;:::-;;:::i;33858:37::-;;;;;;;;;;-1:-1:-1;33858:37:0;;;;-1:-1:-1;;;;;33858:37:0;;;;;;-1:-1:-1;;;;;7673:32:1;;;7655:51;;7643:2;7628:18;33858:37:0;7610:102:1;12069:127:0;;;;;;;;;;-1:-1:-1;12069:127:0;;;;;:::i;:::-;;:::i;22521:148::-;;;;;;;;;;;;;:::i;28543:553::-;;;;;;;;;;-1:-1:-1;28543:553:0;;;;;:::i;:::-;;:::i;20523:332::-;;;;;;;;;;-1:-1:-1;20523:332:0;;;;;:::i;:::-;;:::i;21870:87::-;;;;;;;;;;-1:-1:-1;21943:6:0;;-1:-1:-1;;;;;21943:6:0;21870:87;;11015:95;;;;;;;;;;;;;:::i;30597:528::-;;;;;;;;;;;;;:::i;15209:397::-;;;;;;;;;;-1:-1:-1;15209:397:0;;;;;:::i;:::-;;:::i;12409:175::-;;;;;;;;;;-1:-1:-1;12409:175:0;;;;;:::i;:::-;;:::i;33498:257::-;;;;;;;;;;-1:-1:-1;33498:257:0;;;;;:::i;:::-;;:::i;12647:181::-;;;;;;;;;;-1:-1:-1;12647:181:0;;;;;:::i;:::-;-1:-1:-1;;;;;12793:18:0;;;12761:7;12793:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12647:181;22824:244;;;;;;;;;;-1:-1:-1;22824:244:0;;;;;:::i;:::-;;:::i;10805:91::-;10850:13;10883:5;10876:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10805:91;;:::o;12975:169::-;13058:4;13075:39;13084:12;:10;:12::i;:::-;13098:7;13107:6;13075:8;:39::i;:::-;-1:-1:-1;13132:4:0;12975:169;;;;:::o;5058:1148::-;5316:152;;;5259:12;5316:152;;;;;-1:-1:-1;;;;;5354:19:0;;5284:29;5354:19;;;:6;:19;;;;;;;;;5316:152;;;;;;;;;;;5503:45;5361:11;5316:152;5531:4;5537;5543;5503:6;:45::i;:::-;5481:128;;;;-1:-1:-1;;;5481:128:0;;16781:2:1;5481:128:0;;;16763:21:1;16820:2;16800:18;;;16793:30;16859:34;16839:18;;;16832:62;-1:-1:-1;;;16910:18:1;;;16903:31;16951:19;;5481:128:0;;;;;;;;;-1:-1:-1;;;;;5698:19:0;;;;;;:6;:19;;;;;;;;;:23;;;:::i;:::-;-1:-1:-1;;;;;5676:19:0;;;;;;:6;:19;;;;;;;:45;;;;5739:126;;;;;5683:11;;5811:10;;5837:17;;5739:126;:::i;:::-;;;;;;;;5976:12;5990:23;6025:4;-1:-1:-1;;;;;6017:18:0;6067:17;6086:11;6050:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6050:48:0;;;;;;;;;;6017:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5975:134;;;;6128:7;6120:48;;;;-1:-1:-1;;;6120:48:0;;14435:2:1;6120:48:0;;;14417:21:1;14474:2;14454:18;;;14447:30;14513;14493:18;;;14486:58;14561:18;;6120:48:0;14407:178:1;6120:48:0;6188:10;5058:1148;-1:-1:-1;;;;;;;;5058:1148:0:o;13626:456::-;13766:4;13783:36;13793:6;13801:9;13812:6;13783:9;:36::i;:::-;-1:-1:-1;;;;;13859:19:0;;13832:24;13859:19;;;:11;:19;;;;;13832:24;13879:12;:10;:12::i;:::-;-1:-1:-1;;;;;13859:33:0;-1:-1:-1;;;;;13859:33:0;;;;;;;;;;;;;13832:60;;13931:6;13911:16;:26;;13903:79;;;;-1:-1:-1;;;13903:79:0;;16011:2:1;13903:79:0;;;15993:21:1;16050:2;16030:18;;;16023:30;16089:34;16069:18;;;16062:62;-1:-1:-1;;;16140:18:1;;;16133:38;16188:19;;13903:79:0;15983:230:1;13903:79:0;13993:57;14002:6;14010:12;:10;:12::i;:::-;14024:25;14043:6;14024:16;:25;:::i;:::-;13993:8;:57::i;:::-;-1:-1:-1;14070:4:0;;13626:456;-1:-1:-1;;;;13626:456:0:o;33763:87::-;33817:25;33823:10;33835:6;33817:5;:25::i;:::-;33763:87;:::o;14491:215::-;14579:4;14596:80;14605:12;:10;:12::i;:::-;14619:7;14665:10;14628:11;:25;14640:12;:10;:12::i;:::-;-1:-1:-1;;;;;14628:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14628:25:0;;;:34;;;;;;;;;;:47;;;;:::i;29467:96::-;27119:22;:20;:22::i;:::-;29538:9:::1;:17:::0;;-1:-1:-1;;;;29538:17:0::1;::::0;;29467:96::o;20113:91::-;20169:27;20175:12;:10;:12::i;:::-;20189:6;20169:5;:27::i;33237:253::-;22101:12;:10;:12::i;:::-;-1:-1:-1;;;;;22090:23:0;:7;21943:6;;-1:-1:-1;;;;;21943:6:0;21870:87;;22090:7;-1:-1:-1;;;;;22090:23:0;;22082:68;;;;-1:-1:-1;;;22082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33343:39:0;::::1;33335:86;;;::::0;-1:-1:-1;;;33335:86:0;;12390:2:1;33335:86:0::1;::::0;::::1;12372:21:1::0;12429:2;12409:18;;;12402:30;12468:34;12448:18;;;12441:62;-1:-1:-1;;;12519:18:1;;;12512:32;12561:19;;33335:86:0::1;12362:224:1::0;33335:86:0::1;33432:22;:50:::0;;-1:-1:-1;;;;;;33432:50:0::1;-1:-1:-1::0;;;;;33432:50:0;;;::::1;::::0;;;::::1;::::0;;33237:253::o;29104:355::-;27119:22;:20;:22::i;:::-;29220:19:::1;:17;:19::i;:::-;29212:83;;;;-1:-1:-1::0;;;29212:83:0::1;;;;;;;:::i;:::-;29306:12;29321:18;:16;:18::i;:::-;29306:33;;29355:6;29350:102;29367:19:::0;;::::1;29350:102;;;29408:5;:3;:5::i;:::-;-1:-1:-1::0;;;;;29408:13:0::1;;29422:4;29428:8;;29437:1;29428:11;;;;;-1:-1:-1::0;;;29428:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29408:32;::::0;-1:-1:-1;;;;;;29408:32:0::1;::::0;;;;;;-1:-1:-1;;;;;7947:15:1;;;29408:32:0::1;::::0;::::1;7929:34:1::0;7999:15;;7979:18;;;7972:43;7864:18;;29408:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29388:3;;;;;:::i;:::-;;;;29350:102;;;;27152:1;29104:355:::0;;:::o;12069:127::-;-1:-1:-1;;;;;12170:18:0;;12143:7;12170:18;;;:9;:18;;;;;;12069:127;;;;:::o;22521:148::-;22101:12;:10;:12::i;:::-;-1:-1:-1;;;;;22090:23:0;:7;21943:6;;-1:-1:-1;;;;;21943:6:0;21870:87;;22090:7;-1:-1:-1;;;;;22090:23:0;;22082:68;;;;-1:-1:-1;;;22082:68:0;;;;;;;:::i;:::-;22612:6:::1;::::0;22591:40:::1;::::0;22628:1:::1;::::0;-1:-1:-1;;;;;22612:6:0::1;::::0;22591:40:::1;::::0;22628:1;;22591:40:::1;22642:6;:19:::0;;-1:-1:-1;;;;;;22642:19:0::1;::::0;;22521:148::o;28543:553::-;27119:22;:20;:22::i;:::-;28664:19:::1;:17;:19::i;:::-;28656:83;;;;-1:-1:-1::0;;;28656:83:0::1;;;;;;;:::i;:::-;28750:9;:17:::0;;-1:-1:-1;;;;28750:17:0::1;::::0;;28762:5:::1;28793:18;:16;:18::i;:::-;28778:33;;28827:6;28822:240;28839:19:::0;;::::1;28822:240;;;28880:14;28897:8;;28906:1;28897:11;;;;;-1:-1:-1::0;;;28897:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28880:28;;28927:5;:3;:5::i;:::-;:29;::::0;-1:-1:-1;;;28927:29:0;;-1:-1:-1;;;;;7947:15:1;;;28927:29:0::1;::::0;::::1;7929:34:1::0;7999:15;;;7979:18;;;7972:43;28927:15:0;;;::::1;::::0;::::1;::::0;7864:18:1;;28927:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28923:128;;;28977:58;28992:6;29000:9;29011:23;29027:6;29011:15;:23::i;:::-;28977:14;:58::i;:::-;-1:-1:-1::0;28860:3:0;::::1;::::0;::::1;:::i;:::-;;;;28822:240;;;-1:-1:-1::0;;29072:9:0::1;:16:::0;;-1:-1:-1;;;;29072:16:0::1;-1:-1:-1::0;;;29072:16:0::1;::::0;;-1:-1:-1;;;28543:553:0:o;20523:332::-;20600:24;20627:32;20637:7;20646:12;:10;:12::i;20627:32::-;20600:59;;20698:6;20678:16;:26;;20670:75;;;;-1:-1:-1;;;20670:75:0;;17183:2:1;20670:75:0;;;17165:21:1;17222:2;17202:18;;;17195:30;17261:34;17241:18;;;17234:62;-1:-1:-1;;;17312:18:1;;;17305:34;17356:19;;20670:75:0;17155:226:1;20670:75:0;20756:58;20765:7;20774:12;:10;:12::i;:::-;20788:25;20807:6;20788:16;:25;:::i;20756:58::-;20825:22;20831:7;20840:6;20825:5;:22::i;:::-;20523:332;;;:::o;11015:95::-;11062:13;11095:7;11088:14;;;;;:::i;30597:528::-;30645:7;30730:91;26842:66;32191:42;30799:4;33171:42;30730:24;:91::i;:::-;30723:98;;;;30966:151;30959:158;;30597:528;:::o;15209:397::-;15317:4;15339:24;15366:11;:25;15378:12;:10;:12::i;:::-;-1:-1:-1;;;;;15366:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15366:25:0;;;:34;;;;;;;;;;;-1:-1:-1;15419:35:0;;;;15411:85;;;;-1:-1:-1;;;15411:85:0;;19160:2:1;15411:85:0;;;19142:21:1;19199:2;19179:18;;;19172:30;19238:34;19218:18;;;19211:62;-1:-1:-1;;;19289:18:1;;;19282:35;19334:19;;15411:85:0;19132:227:1;15411:85:0;15507:67;15516:12;:10;:12::i;:::-;15530:7;15539:34;15558:15;15539:16;:34;:::i;15507:67::-;-1:-1:-1;15594:4:0;;15209:397;-1:-1:-1;;;15209:397:0:o;12409:175::-;12495:4;12512:42;12522:12;:10;:12::i;:::-;12536:9;12547:6;12512:9;:42::i;33498:257::-;33599:22;;-1:-1:-1;;;;;33599:22:0;33585:10;:36;33577:78;;;;-1:-1:-1;;;33577:78:0;;12793:2:1;33577:78:0;;;12775:21:1;12832:2;12812:18;;;12805:30;12871:31;12851:18;;;12844:59;12920:18;;33577:78:0;12765:179:1;33577:78:0;33666:14;33683:34;;;;33694:11;33683:34;:::i;:::-;33666:51;;33728:19;33734:4;33740:6;33728:5;:19::i;22824:244::-;22101:12;:10;:12::i;:::-;-1:-1:-1;;;;;22090:23:0;:7;21943:6;;-1:-1:-1;;;;;21943:6:0;21870:87;;22090:7;-1:-1:-1;;;;;22090:23:0;;22082:68;;;;-1:-1:-1;;;22082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22913:22:0;::::1;22905:73;;;::::0;-1:-1:-1;;;22905:73:0;;13625:2:1;22905:73:0::1;::::0;::::1;13607:21:1::0;13664:2;13644:18;;;13637:30;13703:34;13683:18;;;13676:62;-1:-1:-1;;;13754:18:1;;;13747:36;13800:19;;22905:73:0::1;13597:228:1::0;22905:73:0::1;23015:6;::::0;22994:38:::1;::::0;-1:-1:-1;;;;;22994:38:0;;::::1;::::0;23015:6:::1;::::0;22994:38:::1;::::0;23015:6:::1;::::0;22994:38:::1;23043:6;:17:::0;;-1:-1:-1;;;;;;23043:17:0::1;-1:-1:-1::0;;;;;23043:17:0;;;::::1;::::0;;;::::1;::::0;;22824:244::o;8458:99::-;8511:7;8538:11;:9;:11::i;18619:380::-;-1:-1:-1;;;;;18755:19:0;;18747:68;;;;-1:-1:-1;;;18747:68:0;;18396:2:1;18747:68:0;;;18378:21:1;18435:2;18415:18;;;18408:30;18474:34;18454:18;;;18447:62;-1:-1:-1;;;18525:18:1;;;18518:34;18569:19;;18747:68:0;18368:226:1;18747:68:0;-1:-1:-1;;;;;18834:21:0;;18826:68;;;;-1:-1:-1;;;18826:68:0;;14032:2:1;18826:68:0;;;14014:21:1;14071:2;14051:18;;;14044:30;14110:34;14090:18;;;14083:62;-1:-1:-1;;;14161:18:1;;;14154:32;14203:19;;18826:68:0;14004:224:1;18826:68:0;-1:-1:-1;;;;;18907:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18959:32;;9654:25:1;;;18959:32:0;;9627:18:1;18959:32:0;;;;;;;;18619:380;;;:::o;6747:486::-;6925:4;-1:-1:-1;;;;;6950:20:0;;6942:70;;;;-1:-1:-1;;;6942:70:0;;15605:2:1;6942:70:0;;;15587:21:1;15644:2;15624:18;;;15617:30;15683:34;15663:18;;;15656:62;-1:-1:-1;;;15734:18:1;;;15727:35;15779:19;;6942:70:0;15577:227:1;6942:70:0;7066:159;7094:47;7113:27;7133:6;7113:19;:27::i;:::-;7094:18;:47::i;:::-;7066:159;;;;;;;;;;;;10339:25:1;;;;10412:4;10400:17;;10380:18;;;10373:45;10434:18;;;10427:34;;;10477:18;;;10470:34;;;10311:19;;7066:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7043:182:0;:6;-1:-1:-1;;;;;7043:182:0;;7023:202;;6747:486;;;;;;;:::o;16096:638::-;-1:-1:-1;;;;;16236:20:0;;16228:70;;;;-1:-1:-1;;;16228:70:0;;17990:2:1;16228:70:0;;;17972:21:1;18029:2;18009:18;;;18002:30;18068:34;18048:18;;;18041:62;-1:-1:-1;;;18119:18:1;;;18112:35;18164:19;;16228:70:0;17962:227:1;16228:70:0;-1:-1:-1;;;;;16317:23:0;;16309:71;;;;-1:-1:-1;;;16309:71:0;;11163:2:1;16309:71:0;;;11145:21:1;11202:2;11182:18;;;11175:30;11241:34;11221:18;;;11214:62;-1:-1:-1;;;11292:18:1;;;11285:33;11335:19;;16309:71:0;11135:225:1;16309:71:0;16393:47;16414:6;16422:9;16433:6;16393:20;:47::i;:::-;-1:-1:-1;;;;;16477:17:0;;16453:21;16477:17;;;:9;:17;;;;;;16513:23;;;;16505:74;;;;-1:-1:-1;;;16505:74:0;;14792:2:1;16505:74:0;;;14774:21:1;14831:2;14811:18;;;14804:30;14870:34;14850:18;;;14843:62;-1:-1:-1;;;14921:18:1;;;14914:36;14967:19;;16505:74:0;14764:228:1;16505:74:0;16610:22;16626:6;16610:13;:22;:::i;:::-;-1:-1:-1;;;;;16590:17:0;;;;;;;:9;:17;;;;;;:42;;;;16643:20;;;;;;;;:30;;16667:6;;16590:17;16643:30;;16667:6;;16643:30;:::i;:::-;;;;;;;;16708:9;-1:-1:-1;;;;;16691:35:0;16700:6;-1:-1:-1;;;;;16691:35:0;;16719:6;16691:35;;;;9654:25:1;;9642:2;9627:18;;9609:76;16691:35:0;;;;;;;;16096:638;;;;:::o;17687:494::-;-1:-1:-1;;;;;17771:21:0;;17763:67;;;;-1:-1:-1;;;17763:67:0;;17588:2:1;17763:67:0;;;17570:21:1;17627:2;17607:18;;;17600:30;17666:34;17646:18;;;17639:62;-1:-1:-1;;;17717:18:1;;;17710:31;17758:19;;17763:67:0;17560:223:1;17763:67:0;17843:49;17864:7;17881:1;17885:6;17843:20;:49::i;:::-;-1:-1:-1;;;;;17930:18:0;;17905:22;17930:18;;;:9;:18;;;;;;17967:24;;;;17959:71;;;;-1:-1:-1;;;17959:71:0;;11987:2:1;17959:71:0;;;11969:21:1;12026:2;12006:18;;;11999:30;12065:34;12045:18;;;12038:62;-1:-1:-1;;;12116:18:1;;;12109:32;12158:19;;17959:71:0;11959:224:1;17959:71:0;18062:23;18079:6;18062:14;:23;:::i;:::-;-1:-1:-1;;;;;18041:18:0;;;;;;:9;:18;;;;;:44;;;;18096:12;:22;;18112:6;;18041:18;18096:22;;18112:6;;18096:22;:::i;:::-;;;;-1:-1:-1;;18136:37:0;;9654:25:1;;;18162:1:0;;-1:-1:-1;;;;;18136:37:0;;;;;9642:2:1;9627:18;18136:37:0;9609:76:1;31571:67:0;22101:12;:10;:12::i;:::-;-1:-1:-1;;;;;22090:23:0;:7;21943:6;;-1:-1:-1;;;;;21943:6:0;21870:87;;22090:7;-1:-1:-1;;;;;22090:23:0;;22082:68;;;;-1:-1:-1;;;22082:68:0;;;;;;;:::i;:::-;31571:67::o;32614:419::-;32674:4;32698:38;32725:10;32698:26;:38::i;28088:104::-;28124:5;31771:42;28155:28;31675:146;31408:157;31481:4;31505:18;31515:7;31505:9;:18::i;:::-;31498:25;31408:157;-1:-1:-1;;31408:157:0:o;31224:178::-;31319:30;31329:5;31336:3;31341:7;31319:9;:30::i;23696:452::-;23807:12;23833:14;23849;23867:26;23878:6;23886;23867:10;:26::i;:::-;24039:32;;-1:-1:-1;;;;;;5794:2:1;5790:15;;;5786:24;;24039:32:0;;;5774:37:1;5845:15;;;5841:24;5827:12;;;5820:46;23832:61:0;;-1:-1:-1;23832:61:0;-1:-1:-1;24003:7:0;;5882:12:1;;24039:32:0;;;;;;;;;;;;24029:43;;;;;;24091:12;23942:194;;;;;;;;;-1:-1:-1;;;;;;7287:26:1;;7350:2;7346:15;;;;-1:-1:-1;;;;;;7342:53:1;7338:1;7329:11;;7322:74;7421:2;7412:12;;7405:28;;;;7458:2;7449:12;;7442:28;7495:2;7486:12;;7277:227;23942:194:0;;;;-1:-1:-1;;23942:194:0;;;;;;;;;23932:205;;23942:194;23932:205;;;;;23696:452;-1:-1:-1;;;;;;;23696:452:0:o;17016:338::-;-1:-1:-1;;;;;17100:21:0;;17092:65;;;;-1:-1:-1;;;17092:65:0;;19566:2:1;17092:65:0;;;19548:21:1;19605:2;19585:18;;;19578:30;19644:33;19624:18;;;19617:61;19695:18;;17092:65:0;19538:181:1;17092:65:0;17170:49;17199:1;17203:7;17212:6;17170:20;:49::i;:::-;17248:6;17232:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;17265:18:0;;;;;;:9;:18;;;;;:28;;17287:6;;17265:18;:28;;17287:6;;17265:28;:::i;:::-;;;;-1:-1:-1;;17309:37:0;;9654:25:1;;;-1:-1:-1;;;;;17309:37:0;;;17326:1;;17309:37;;9642:2:1;9627:18;17309:37:0;;;;;;;17016:338;;:::o;7278:618::-;7322:22;7361:10;7383:4;7361:27;7357:508;;;7405:18;7426:8;;7405:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;7465:8:0;7676:17;7670:24;-1:-1:-1;;;;;7644:134:0;;-1:-1:-1;7504:289:0;;-1:-1:-1;7504:289:0;;-1:-1:-1;7842:10:0;7278:618;:::o;6214:410::-;6324:7;4382:108;;;;;;;;;;;;;;;;;4358:143;;;;;;;6478:12;;6513:11;;;;6557:24;;;;;6547:35;;;;;;6397:204;;;;;9921:25:1;;;9977:2;9962:18;;9955:34;;;;-1:-1:-1;;;;;10025:32:1;10020:2;10005:18;;9998:60;10089:2;10074:18;;10067:34;9908:3;9893:19;;9875:232;6397:204:0;;;;;;;;;;;;;6369:247;;;;;;6349:267;;6214:410;;;:::o;3970:258::-;4069:7;3840:15;;4142:63;;-1:-1:-1;;;4142:63:0;;;6862:27:1;6905:11;;;6898:27;;;;6941:12;;;6934:28;;;6978:12;;4142:63:0;6852:144:1;32247:227:0;32406:60;32446:5;32453:3;32458:7;32406:39;:60::i;29769:130::-;29844:4;29868:23;29872:18;29879:10;30247:15;-1:-1:-1;30234:28:0;30155:115;29872:18;30354:11;;30278:95;23255:349;23330:14;23346;23391:6;-1:-1:-1;;;;;23381:16:0;:6;-1:-1:-1;;;;;23381:16:0;;;23373:66;;;;-1:-1:-1;;;23373:66:0;;15199:2:1;23373:66:0;;;15181:21:1;15238:2;15218:18;;;15211:30;15277:34;15257:18;;;15250:62;-1:-1:-1;;;15328:18:1;;;15321:35;15373:19;;23373:66:0;15171:227:1;23373:66:0;23478:6;-1:-1:-1;;;;;23469:15:0;:6;-1:-1:-1;;;;;23469:15:0;;:53;;23507:6;23515;23469:53;;;23488:6;23496;23469:53;23450:72;;-1:-1:-1;23450:72:0;-1:-1:-1;;;;;;23541:20:0;;23533:63;;;;-1:-1:-1;;;23533:63:0;;18801:2:1;23533:63:0;;;18783:21:1;18840:2;18820:18;;;18813:30;18879:32;18859:18;;;18852:60;18929:18;;23533:63:0;18773:180:1;23533:63:0;23255:349;;;;;:::o;28200:335::-;28323:19;:17;:19::i;:::-;28319:209;;;28364:9;;-1:-1:-1;;;28364:9:0;;;;28359:57;;28394:7;;28359:57;28430:5;:3;:5::i;:::-;-1:-1:-1;;;;;28430:45:0;;28476:18;:16;:18::i;:::-;28430:86;;-1:-1:-1;;;;;;28430:86:0;;;;;;;-1:-1:-1;;;;;8749:15:1;;;28430:86:0;;;8731:34:1;8801:15;;;8781:18;;;8774:43;8853:15;;;8833:18;;;8826:43;8885:18;;;8878:34;;;8665:19;;28430:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28200:335;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:391;;;319:3;312:4;304:6;300:17;296:27;286:2;;342:6;334;327:22;286:2;-1:-1:-1;370:20:1;;413:18;402:30;;399:2;;;452:8;442;435:26;399:2;496:4;488:6;484:17;472:29;;556:3;549:4;539:6;536:1;532:14;524:6;520:27;516:38;513:47;510:2;;;573:1;570;563:12;588:156;654:20;;714:4;703:16;;693:27;;683:2;;734:1;731;724:12;749:196;;861:2;849:9;840:7;836:23;832:32;829:2;;;882:6;874;867:22;829:2;910:29;929:9;910:29;:::i;:::-;900:39;819:126;-1:-1:-1;;;819:126:1:o;950:270::-;;;1079:2;1067:9;1058:7;1054:23;1050:32;1047:2;;;1100:6;1092;1085:22;1047:2;1128:29;1147:9;1128:29;:::i;:::-;1118:39;;1176:38;1210:2;1199:9;1195:18;1176:38;:::i;:::-;1166:48;;1037:183;;;;;:::o;1225:338::-;;;;1371:2;1359:9;1350:7;1346:23;1342:32;1339:2;;;1392:6;1384;1377:22;1339:2;1420:29;1439:9;1420:29;:::i;:::-;1410:39;;1468:38;1502:2;1491:9;1487:18;1468:38;:::i;:::-;1458:48;;1553:2;1542:9;1538:18;1525:32;1515:42;;1329:234;;;;;:::o;1568:715::-;;;;1716:2;1704:9;1695:7;1691:23;1687:32;1684:2;;;1737:6;1729;1722:22;1684:2;1765:29;1784:9;1765:29;:::i;:::-;1755:39;;1845:2;1834:9;1830:18;1817:32;1868:18;1909:2;1901:6;1898:14;1895:2;;;1930:6;1922;1915:22;1895:2;1973:6;1962:9;1958:22;1948:32;;2018:7;2011:4;2007:2;2003:13;1999:27;1989:2;;2045:6;2037;2030:22;1989:2;2090;2077:16;2116:2;2108:6;2105:14;2102:2;;;2137:6;2129;2122:22;2102:2;2187:7;2182:2;2173:6;2169:2;2165:15;2161:24;2158:37;2155:2;;;2213:6;2205;2198:22;2155:2;2249;2245;2241:11;2231:21;;2271:6;2261:16;;;;;1674:609;;;;;:::o;2288:1248::-;;;;;;2475:3;2463:9;2454:7;2450:23;2446:33;2443:2;;;2497:6;2489;2482:22;2443:2;2525:29;2544:9;2525:29;:::i;:::-;2515:39;;2605:2;2594:9;2590:18;2577:32;2628:18;2669:2;2661:6;2658:14;2655:2;;;2690:6;2682;2675:22;2655:2;2733:6;2722:9;2718:22;2708:32;;2778:7;2771:4;2767:2;2763:13;2759:27;2749:2;;2805:6;2797;2790:22;2749:2;2846;2833:16;2868:2;2864;2861:10;2858:2;;;2874:18;;:::i;:::-;2949:2;2943:9;2917:2;3003:13;;-1:-1:-1;;2999:22:1;;;3023:2;2995:31;2991:40;2979:53;;;3047:18;;;3067:22;;;3044:46;3041:2;;;3093:18;;:::i;:::-;3133:10;3129:2;3122:22;3168:2;3160:6;3153:18;3208:7;3203:2;3198;3194;3190:11;3186:20;3183:33;3180:2;;;3234:6;3226;3219:22;3180:2;3295;3290;3286;3282:11;3277:2;3269:6;3265:15;3252:46;3318:15;;;3335:2;3314:24;3307:40;;;-1:-1:-1;3322:6:1;-1:-1:-1;;;3419:2:1;3404:18;;3391:32;;-1:-1:-1;3470:2:1;3455:18;;3442:32;;-1:-1:-1;3493:37:1;3525:3;3510:19;;3493:37;:::i;:::-;3483:47;;2433:1103;;;;;;;;:::o;3541:264::-;;;3670:2;3658:9;3649:7;3645:23;3641:32;3638:2;;;3691:6;3683;3676:22;3638:2;3719:29;3738:9;3719:29;:::i;:::-;3709:39;3795:2;3780:18;;;;3767:32;;-1:-1:-1;;;3628:177:1:o;3810:457::-;;;3957:2;3945:9;3936:7;3932:23;3928:32;3925:2;;;3978:6;3970;3963:22;3925:2;4023:9;4010:23;4056:18;4048:6;4045:30;4042:2;;;4093:6;4085;4078:22;4042:2;4137:70;4199:7;4190:6;4179:9;4175:22;4137:70;:::i;:::-;4226:8;;4111:96;;-1:-1:-1;3915:352:1;-1:-1:-1;;;;3915:352:1:o;4272:531::-;;;;4436:2;4424:9;4415:7;4411:23;4407:32;4404:2;;;4457:6;4449;4442:22;4404:2;4502:9;4489:23;4535:18;4527:6;4524:30;4521:2;;;4572:6;4564;4557:22;4521:2;4616:70;4678:7;4669:6;4658:9;4654:22;4616:70;:::i;:::-;4705:8;;-1:-1:-1;4590:96:1;-1:-1:-1;4759:38:1;;-1:-1:-1;4793:2:1;4778:18;;4759:38;:::i;:::-;4749:48;;4394:409;;;;;:::o;4808:297::-;;4928:2;4916:9;4907:7;4903:23;4899:32;4896:2;;;4949:6;4941;4934:22;4896:2;4986:9;4980:16;5039:5;5032:13;5025:21;5018:5;5015:32;5005:2;;5066:6;5058;5051:22;5110:190;;5222:2;5210:9;5201:7;5197:23;5193:32;5190:2;;;5243:6;5235;5228:22;5190:2;-1:-1:-1;5271:23:1;;5180:120;-1:-1:-1;5180:120:1:o;5305:257::-;;5384:5;5378:12;5411:6;5406:3;5399:19;5427:63;5483:6;5476:4;5471:3;5467:14;5460:4;5453:5;5449:16;5427:63;:::i;:::-;5544:2;5523:15;-1:-1:-1;;5519:29:1;5510:39;;;;5551:4;5506:50;;5354:208;-1:-1:-1;;5354:208:1:o;5905:274::-;;6072:6;6066:13;6088:53;6134:6;6129:3;6122:4;6114:6;6110:17;6088:53;:::i;:::-;6157:16;;;;;6042:137;-1:-1:-1;;6042:137:1:o;6184:415::-;;6379:6;6373:13;6395:53;6441:6;6436:3;6429:4;6421:6;6417:17;6395:53;:::i;:::-;6517:2;6513:15;;;;-1:-1:-1;;;;;;6509:53:1;6470:16;;;;6495:68;;;6590:2;6579:14;;6349:250;-1:-1:-1;;6349:250:1:o;8026:431::-;-1:-1:-1;;;;;8283:15:1;;;8265:34;;8335:15;;8330:2;8315:18;;8308:43;8387:2;8382;8367:18;;8360:30;;;8026:431;;8407:44;;8432:18;;8424:6;8407:44;:::i;:::-;8399:52;8217:240;-1:-1:-1;;;;;8217:240:1:o;10515:217::-;;10662:2;10651:9;10644:21;10682:44;10722:2;10711:9;10707:18;10699:6;10682:44;:::i;11365:415::-;11567:2;11549:21;;;11606:2;11586:18;;;11579:30;11645:34;11640:2;11625:18;;11618:62;-1:-1:-1;;;11711:2:1;11696:18;;11689:49;11770:3;11755:19;;11539:241::o;16218:356::-;16420:2;16402:21;;;16439:18;;;16432:30;16498:34;16493:2;16478:18;;16471:62;16565:2;16550:18;;16392:182::o;20095:128::-;;20166:1;20162:6;20159:1;20156:13;20153:2;;;20172:18;;:::i;:::-;-1:-1:-1;20208:9:1;;20143:80::o;20228:125::-;;20296:1;20293;20290:8;20287:2;;;20301:18;;:::i;:::-;-1:-1:-1;20338:9:1;;20277:76::o;20358:258::-;20430:1;20440:113;20454:6;20451:1;20448:13;20440:113;;;20530:11;;;20524:18;20511:11;;;20504:39;20476:2;20469:10;20440:113;;;20571:6;20568:1;20565:13;20562:2;;;-1:-1:-1;;20606:1:1;20588:16;;20581:27;20411:205::o;20621:380::-;20700:1;20696:12;;;;20743;;;20764:2;;20818:4;20810:6;20806:17;20796:27;;20764:2;20871;20863:6;20860:14;20840:18;20837:38;20834:2;;;20917:10;20912:3;20908:20;20905:1;20898:31;20952:4;20949:1;20942:15;20980:4;20977:1;20970:15;20834:2;;20676:325;;;:::o;21006:135::-;;-1:-1:-1;;21066:17:1;;21063:2;;;21086:18;;:::i;:::-;-1:-1:-1;21133:1:1;21122:13;;21053:88::o;21146:127::-;21207:10;21202:3;21198:20;21195:1;21188:31;21238:4;21235:1;21228:15;21262:4;21259:1;21252:15;21278:127;21339:10;21334:3;21330:20;21327:1;21320:31;21370:4;21367:1;21360:15;21394:4;21391:1;21384:15

Swarm Source

ipfs://a179aecc73e90718f39b5d2ec902066731687118a1f146a225313db2d11aba2a
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.