ETH Price: $3,106.39 (+1.46%)
Gas: 4 Gwei

Token

ScaleSwapToken (SCA)
 

Overview

Max Total Supply

24,668,824.89834491620136054 SCA

Holders

307 (0.00%)

Market

Price

$0.03 @ 0.000008 ETH (+1.52%)

Onchain Market Cap

$641,315.93

Circulating Supply Market Cap

$641,316.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
427.275475732642777098 SCA

Value
$11.11 ( ~0.00357649383608257 Eth) [0.0017%]
0x8abb25eefa45ca6ed7b9e5148ce59169d4cacd22
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Scaleswap is an IDO launchpad built on ETH layer 2 (Polygon/Matic). Their platform is governed in a decentralized way and allows blockchain-based projects to accelerate their pre-listing activities by creating IDO pools.

Market

Volume (24H):$2.54
Market Capitalization:$641,316.00
Circulating Supply:24,668,825.00 SCA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

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 Etherscan.io 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(
                uint256(
                    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,
        uint256 _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,
        uint256 amount
    ) internal virtual;

    function token_balanceOf(address holder)
        internal
        view
        virtual
        returns (uint256);

    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,
        uint256 _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 (uint256 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 (uint256 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(uint256 _timestamp)
        internal
        view
        returns (bool)
    {
        return not(passed(_timestamp));
    }

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

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

    function passed(uint256 _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,
        uint256 _amount
    ) internal override {
        _transfer(_from, _to, _amount); // Expose low-level token transfer function.
    }

    function token_balanceOf(address _holder)
        internal
        view
        override
        returns (uint256)
    {
        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 UNISWAP; // UNISWAP / PANCAKESWAP / QUICKSWAP.
    }

    function uniswapVersion() internal pure override returns (UniswapVersion) {
        return UniswapVersion.V2; // V2 or V3.
    }

    function uniswapFactory() internal pure override returns (address) {
        return 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    }

    function _beforeTokenTransfer(
        address _from,
        address _to,
        uint256 _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 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // WETH
    }

    constructor() ERC20("ScaleSwapToken", "SCA") {
        _mint(owner(), 25000000 * 1e18);
    }
}

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":"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":[],"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"}]

60806040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040518060400160405280600e81526020016d29b1b0b632a9bbb0b82a37b5b2b760911b8152506040518060400160405280600381526020016253434160e81b815250816040518060800160405280604f815260200162002659604f913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc630620000d7620001de565b60408051602081019690965285019390935260608401919091526001600160a01b0316608083015260a082015260c00160408051601f1981840301815291905280516020918201206000558351620001369250600591850190620006b3565b5080516200014c906006906020840190620006b3565b505050600062000161620001e360201b60201c565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001d8620001c66007546001600160a01b031690565b6a14adf4b7320334b9000000620001f4565b620007bb565b465b90565b6000620001ef620002eb565b905090565b6001600160a01b038216620002505760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200025e6000838362000349565b806004600082825462000272919062000759565b90915550506001600160a01b03821660009081526002602052604081208054839290620002a190849062000759565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000333014156200034457600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620001e09050565b503390565b620003618383836200036e60201b62000c311760201c565b6200036e83838362000373565b505050565b6200037d62000434565b156200036e57600754600160a01b900460ff166200039b576200036e565b620003a562000445565b6001600160a01b0316630336a330620003bd62000462565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b1580156200041657600080fd5b505af11580156200042b573d6000803e3d6000fd5b50505050505050565b6000620001ef6360fa067f620004cd565b6000730d0e7c27d25160231a4ce475cb9b296a41aea329620001ef565b6000620004c57f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620004e760201b62000e7e1760201c565b9050620001e0565b6000620004e1620004dd83421190565b1590565b92915050565b60008080620004f78585620005b5565b6040516001600160601b0319606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001208860405160200162000592939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b60408051601f198184030181529190528051602090910120979650505050505050565b600080826001600160a01b0316846001600160a01b031614156200062a5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b606482015260840162000247565b826001600160a01b0316846001600160a01b0316106200064c5782846200064f565b83835b90925090506001600160a01b038216620006ac5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015260640162000247565b9250929050565b828054620006c1906200077e565b90600052602060002090601f016020900481019282620006e5576000855562000730565b82601f106200070057805160ff191683800117855562000730565b8280016001018555821562000730579182015b828111156200073057825182559160200191906001019062000713565b506200073e92915062000742565b5090565b5b808211156200073e576000815560010162000743565b600082198211156200077957634e487b7160e01b81526011600452602481fd5b500190565b600181811c908216806200079357607f821691505b60208210811415620007b557634e487b7160e01b600052602260045260246000fd5b50919050565b611e8e80620007cb6000396000f3fe6080604052600436106101665760003560e01c80635300f82b116100d15780638da5cb5b1161008a578063a457c2d711610064578063a457c2d7146103fa578063a9059cbb1461041a578063dd62ed3e1461043a578063f2fde38b1461048057610166565b80638da5cb5b1461039e57806395d89b41146103d057806395ddbe89146103e557610166565b80635300f82b146102e95780635fdb86f91461030957806370a0823114610329578063715018a61461034957806375ee83891461035e57806379cc67901461037e57610166565b80632d0335ab116101235780632d0335ab1461022d578063313ce567146102635780633408e4701461027f5780633950935114610292578063421dd7c7146102b257806342966c68146102c957610166565b806306fdde031461016b578063095ea7b3146101965780630c53c51c146101c657806318160ddd146101d957806320379ee5146101f857806323b872dd1461020d575b600080fd5b34801561017757600080fd5b506101806104a0565b60405161018d9190611c9d565b60405180910390f35b3480156101a257600080fd5b506101b66101b1366004611ac8565b610533565b604051901515815260200161018d565b6101806101d43660046119e9565b610550565b3480156101e557600080fd5b506004545b60405190815260200161018d565b34801561020457600080fd5b506000546101ea565b34801561021957600080fd5b506101b66102283660046119ae565b610740565b34801561023957600080fd5b506101ea61024836600461195b565b6001600160a01b031660009081526001602052604090205490565b34801561026f57600080fd5b506040516012815260200161018d565b34801561028b57600080fd5b50466101ea565b34801561029e57600080fd5b506101b66102ad366004611ac8565b610818565b3480156102be57600080fd5b506102c7610867565b005b3480156102d557600080fd5b506102c76102e4366004611ba3565b61087e565b3480156102f557600080fd5b506101b6600754600160a01b900460ff1690565b34801561031557600080fd5b506102c7610324366004611af1565b610892565b34801561033557600080fd5b506101ea61034436600461195b565b61099a565b34801561035557600080fd5b506102c76109b9565b34801561036a57600080fd5b506102c7610379366004611b31565b610a4c565b34801561038a57600080fd5b506102c7610399366004611ac8565b610ba5565b3480156103aa57600080fd5b506007546001600160a01b03165b6040516001600160a01b03909116815260200161018d565b3480156103dc57600080fd5b50610180610c36565b3480156103f157600080fd5b506103b8610c45565b34801561040657600080fd5b506101b6610415366004611ac8565b610ca7565b34801561042657600080fd5b506101b6610435366004611ac8565b610d60565b34801561044657600080fd5b506101ea61045536600461197c565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561048c57600080fd5b506102c761049b36600461195b565b610d74565b6060600580546104af90611d93565b80601f01602080910402602001604051908101604052809291908181526020018280546104db90611d93565b80156105285780601f106104fd57610100808354040283529160200191610528565b820191906000526020600020905b81548152906001019060200180831161050b57829003601f168201915b505050505090505b90565b6000610547610540611034565b848461103e565b50600192915050565b60408051606081810183526001600160a01b0388166000818152600160209081529085902054845283015291810186905261058e8782878787611163565b6105e95760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084015b60405180910390fd5b6001600160a01b03871660009081526001602081905260409091205461060e91611d38565b6001600160a01b0388166000908152600160205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061065e90899033908a90611c68565b60405180910390a1600080306001600160a01b0316888a604051602001610686929190611c03565b60408051601f19818403018152908290526106a091611be7565b6000604051808303816000865af19150503d80600081146106dd576040519150601f19603f3d011682016040523d82523d6000602084013e6106e2565b606091505b5091509150816107345760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016105e0565b98975050505050505050565b600061074d848484611253565b6001600160a01b03841660009081526003602052604081208161076e611034565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156107f25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016105e0565b61080d856107fe611034565b6108088685611d50565b61103e565b506001949350505050565b6000610547610825611034565b848460036000610833611034565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108089190611d38565b61086f611436565b6007805460ff60a01b19169055565b61088f610889611034565b82611481565b50565b61089a611436565b6108a26115dc565b6108be5760405162461bcd60e51b81526004016105e090611cb0565b60006108c8610c45565b905060005b82811015610994576108dd6115eb565b6001600160a01b0316630d8bd5e88386868581811061090c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610921919061195b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561096957600080fd5b505af115801561097d573d6000803e3d6000fd5b50505050808061098c90611dce565b9150506108cd565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b6109c1611034565b6001600160a01b03166109dc6007546001600160a01b031690565b6001600160a01b031614610a025760405162461bcd60e51b81526004016105e090611d03565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b610a54611436565b610a5c6115dc565b610a785760405162461bcd60e51b81526004016105e090611cb0565b6007805460ff60a01b191690556000610a8f610c45565b905060005b83811015610b8b576000858583818110610abe57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ad3919061195b565b9050610add6115eb565b604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b158015610b2857600080fd5b505afa158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b609190611b83565b15610b7857610b788185610b7384611607565b611618565b5080610b8381611dce565b915050610a94565b50506007805460ff60a01b1916600160a01b179055505050565b6000610bb383610455611034565b905081811015610c115760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016105e0565b610c2783610c1d611034565b6108088585611d50565b610c318383611481565b505050565b6060600680546104af90611d93565b6000610c9b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610e7e565b9050610530565b905090565b60008060036000610cb6611034565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d405760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105e0565b610d56610d4b611034565b856108088685611d50565b5060019392505050565b6000610547610d6d611034565b8484611253565b610d7c611034565b6001600160a01b0316610d976007546001600160a01b031690565b6001600160a01b031614610dbd5760405162461bcd60e51b81526004016105e090611d03565b6001600160a01b038116610e225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105e0565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000610e8d8585611623565b6040516001600160601b0319606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001610ee193929190611c35565b60408051601f198184030181529190528051602090910120979650505050505050565b6040805160608101825260008082526020820181905291810191909152826001600160a01b0316846001600160a01b03161115610f3f579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b600081602001516001600160a01b031682600001516001600160a01b031610610f9757600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085039091018152608084019091528051910120611015918591907fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549060a001611c35565b60408051601f1981840301815291905280516020909101209392505050565b6000610ca261171b565b6001600160a01b0383166110a05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105e0565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105e0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006001600160a01b0386166111c95760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016105e0565b60016111dc6111d787611777565b6117f4565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561122a573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6001600160a01b0383166112b75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105e0565b6001600160a01b0382166113195760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105e0565b61132483838361181d565b6001600160a01b0383166000908152600260205260409020548181101561139c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105e0565b6113a68282611d50565b6001600160a01b0380861660009081526002602052604080822093909355908516815290812080548492906113dc908490611d38565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161142891815260200190565b60405180910390a350505050565b61143e611034565b6001600160a01b03166114596007546001600160a01b031690565b6001600160a01b03161461147f5760405162461bcd60e51b81526004016105e090611d03565b565b6001600160a01b0382166114e15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105e0565b6114ed8260008361181d565b6001600160a01b038216600090815260026020526040902054818110156115615760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105e0565b61156b8282611d50565b6001600160a01b03841660009081526002602052604081209190915560048054849290611599908490611d50565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611156565b6000610ca26360fa067f611828565b6000730d0e7c27d25160231a4ce475cb9b296a41aea329610ca2565b60006116128261099a565b92915050565b610c31838383611253565b600080826001600160a01b0316846001600160a01b031614156116965760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016105e0565b826001600160a01b0316846001600160a01b0316106116b65782846116b9565b83835b90925090506001600160a01b0382166117145760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016105e0565b9250929050565b60003330141561177257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506105309050565b503390565b6000604051806080016040528060438152602001611e1660439139805160209182012083518483015160408087015180519086012090516117d7950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000805460405161190160f01b60208201526022810191909152604281018390526062016117d7565b610c3183838361183a565b600061161261183683421190565b1590565b6118426115dc565b15610c3157600754600160a01b900460ff1661185d57610c31565b6118656115eb565b6001600160a01b0316630336a33061187b610c45565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b1580156118d357600080fd5b505af11580156118e7573d6000803e3d6000fd5b50505050505050565b80356001600160a01b03811681146109b457600080fd5b60008083601f840112611918578081fd5b50813567ffffffffffffffff81111561192f578182fd5b6020830191508360208260051b850101111561171457600080fd5b803560ff811681146109b457600080fd5b60006020828403121561196c578081fd5b611975826118f0565b9392505050565b6000806040838503121561198e578081fd5b611997836118f0565b91506119a5602084016118f0565b90509250929050565b6000806000606084860312156119c2578081fd5b6119cb846118f0565b92506119d9602085016118f0565b9150604084013590509250925092565b600080600080600060a08688031215611a00578081fd5b611a09866118f0565b9450602086013567ffffffffffffffff80821115611a25578283fd5b818801915088601f830112611a38578283fd5b813581811115611a4a57611a4a611dff565b604051601f8201601f19908116603f01168101908382118183101715611a7257611a72611dff565b816040528281528b6020848701011115611a8a578586fd5b8260208601602083013791820160200185905250955050506040860135925060608601359150611abc6080870161194a565b90509295509295909350565b60008060408385031215611ada578182fd5b611ae3836118f0565b946020939093013593505050565b60008060208385031215611b03578182fd5b823567ffffffffffffffff811115611b19578283fd5b611b2585828601611907565b90969095509350505050565b600080600060408486031215611b45578283fd5b833567ffffffffffffffff811115611b5b578384fd5b611b6786828701611907565b9094509250611b7a9050602085016118f0565b90509250925092565b600060208284031215611b94578081fd5b81518015158114611975578182fd5b600060208284031215611bb4578081fd5b5035919050565b60008151808452611bd3816020860160208601611d67565b601f01601f19169290920160200192915050565b60008251611bf9818460208701611d67565b9190910192915050565b60008351611c15818460208801611d67565b60609390931b6001600160601b0319169190920190815260140192915050565b6001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b6001600160a01b03848116825283166020820152606060408201819052600090611c9490830184611bbb565b95945050505050565b6000602082526119756020830184611bbb565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d4b57611d4b611de9565b500190565b600082821015611d6257611d62611de9565b500390565b60005b83811015611d82578181015183820152602001611d6a565b838111156109945750506000910152565b600181811c90821680611da757607f821691505b60208210811415611dc857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611de257611de2611de9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122039488ec7d79942096c211fa1f9771945e9bd64c9c70dfd39ae91d9ac764d1e6464736f6c63430008030033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429

Deployed Bytecode

0x6080604052600436106101665760003560e01c80635300f82b116100d15780638da5cb5b1161008a578063a457c2d711610064578063a457c2d7146103fa578063a9059cbb1461041a578063dd62ed3e1461043a578063f2fde38b1461048057610166565b80638da5cb5b1461039e57806395d89b41146103d057806395ddbe89146103e557610166565b80635300f82b146102e95780635fdb86f91461030957806370a0823114610329578063715018a61461034957806375ee83891461035e57806379cc67901461037e57610166565b80632d0335ab116101235780632d0335ab1461022d578063313ce567146102635780633408e4701461027f5780633950935114610292578063421dd7c7146102b257806342966c68146102c957610166565b806306fdde031461016b578063095ea7b3146101965780630c53c51c146101c657806318160ddd146101d957806320379ee5146101f857806323b872dd1461020d575b600080fd5b34801561017757600080fd5b506101806104a0565b60405161018d9190611c9d565b60405180910390f35b3480156101a257600080fd5b506101b66101b1366004611ac8565b610533565b604051901515815260200161018d565b6101806101d43660046119e9565b610550565b3480156101e557600080fd5b506004545b60405190815260200161018d565b34801561020457600080fd5b506000546101ea565b34801561021957600080fd5b506101b66102283660046119ae565b610740565b34801561023957600080fd5b506101ea61024836600461195b565b6001600160a01b031660009081526001602052604090205490565b34801561026f57600080fd5b506040516012815260200161018d565b34801561028b57600080fd5b50466101ea565b34801561029e57600080fd5b506101b66102ad366004611ac8565b610818565b3480156102be57600080fd5b506102c7610867565b005b3480156102d557600080fd5b506102c76102e4366004611ba3565b61087e565b3480156102f557600080fd5b506101b6600754600160a01b900460ff1690565b34801561031557600080fd5b506102c7610324366004611af1565b610892565b34801561033557600080fd5b506101ea61034436600461195b565b61099a565b34801561035557600080fd5b506102c76109b9565b34801561036a57600080fd5b506102c7610379366004611b31565b610a4c565b34801561038a57600080fd5b506102c7610399366004611ac8565b610ba5565b3480156103aa57600080fd5b506007546001600160a01b03165b6040516001600160a01b03909116815260200161018d565b3480156103dc57600080fd5b50610180610c36565b3480156103f157600080fd5b506103b8610c45565b34801561040657600080fd5b506101b6610415366004611ac8565b610ca7565b34801561042657600080fd5b506101b6610435366004611ac8565b610d60565b34801561044657600080fd5b506101ea61045536600461197c565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561048c57600080fd5b506102c761049b36600461195b565b610d74565b6060600580546104af90611d93565b80601f01602080910402602001604051908101604052809291908181526020018280546104db90611d93565b80156105285780601f106104fd57610100808354040283529160200191610528565b820191906000526020600020905b81548152906001019060200180831161050b57829003601f168201915b505050505090505b90565b6000610547610540611034565b848461103e565b50600192915050565b60408051606081810183526001600160a01b0388166000818152600160209081529085902054845283015291810186905261058e8782878787611163565b6105e95760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084015b60405180910390fd5b6001600160a01b03871660009081526001602081905260409091205461060e91611d38565b6001600160a01b0388166000908152600160205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061065e90899033908a90611c68565b60405180910390a1600080306001600160a01b0316888a604051602001610686929190611c03565b60408051601f19818403018152908290526106a091611be7565b6000604051808303816000865af19150503d80600081146106dd576040519150601f19603f3d011682016040523d82523d6000602084013e6106e2565b606091505b5091509150816107345760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016105e0565b98975050505050505050565b600061074d848484611253565b6001600160a01b03841660009081526003602052604081208161076e611034565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156107f25760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016105e0565b61080d856107fe611034565b6108088685611d50565b61103e565b506001949350505050565b6000610547610825611034565b848460036000610833611034565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108089190611d38565b61086f611436565b6007805460ff60a01b19169055565b61088f610889611034565b82611481565b50565b61089a611436565b6108a26115dc565b6108be5760405162461bcd60e51b81526004016105e090611cb0565b60006108c8610c45565b905060005b82811015610994576108dd6115eb565b6001600160a01b0316630d8bd5e88386868581811061090c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610921919061195b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561096957600080fd5b505af115801561097d573d6000803e3d6000fd5b50505050808061098c90611dce565b9150506108cd565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b6109c1611034565b6001600160a01b03166109dc6007546001600160a01b031690565b6001600160a01b031614610a025760405162461bcd60e51b81526004016105e090611d03565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b610a54611436565b610a5c6115dc565b610a785760405162461bcd60e51b81526004016105e090611cb0565b6007805460ff60a01b191690556000610a8f610c45565b905060005b83811015610b8b576000858583818110610abe57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ad3919061195b565b9050610add6115eb565b604051634362c69f60e11b81526001600160a01b038581166004830152838116602483015291909116906386c58d3e9060440160206040518083038186803b158015610b2857600080fd5b505afa158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b609190611b83565b15610b7857610b788185610b7384611607565b611618565b5080610b8381611dce565b915050610a94565b50506007805460ff60a01b1916600160a01b179055505050565b6000610bb383610455611034565b905081811015610c115760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016105e0565b610c2783610c1d611034565b6108088585611d50565b610c318383611481565b505050565b6060600680546104af90611d93565b6000610c9b7f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f3073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610e7e565b9050610530565b905090565b60008060036000610cb6611034565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d405760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105e0565b610d56610d4b611034565b856108088685611d50565b5060019392505050565b6000610547610d6d611034565b8484611253565b610d7c611034565b6001600160a01b0316610d976007546001600160a01b031690565b6001600160a01b031614610dbd5760405162461bcd60e51b81526004016105e090611d03565b6001600160a01b038116610e225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105e0565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000610e8d8585611623565b6040516001600160601b0319606084811b8216602084015283901b166034820152919350915086906048016040516020818303038152906040528051906020012088604051602001610ee193929190611c35565b60408051601f198184030181529190528051602090910120979650505050505050565b6040805160608101825260008082526020820181905291810191909152826001600160a01b0316846001600160a01b03161115610f3f579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b600081602001516001600160a01b031682600001516001600160a01b031610610f9757600080fd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085039091018152608084019091528051910120611015918591907fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b549060a001611c35565b60408051601f1981840301815291905280516020909101209392505050565b6000610ca261171b565b6001600160a01b0383166110a05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105e0565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105e0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006001600160a01b0386166111c95760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016105e0565b60016111dc6111d787611777565b6117f4565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561122a573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6001600160a01b0383166112b75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105e0565b6001600160a01b0382166113195760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105e0565b61132483838361181d565b6001600160a01b0383166000908152600260205260409020548181101561139c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105e0565b6113a68282611d50565b6001600160a01b0380861660009081526002602052604080822093909355908516815290812080548492906113dc908490611d38565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161142891815260200190565b60405180910390a350505050565b61143e611034565b6001600160a01b03166114596007546001600160a01b031690565b6001600160a01b03161461147f5760405162461bcd60e51b81526004016105e090611d03565b565b6001600160a01b0382166114e15760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105e0565b6114ed8260008361181d565b6001600160a01b038216600090815260026020526040902054818110156115615760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105e0565b61156b8282611d50565b6001600160a01b03841660009081526002602052604081209190915560048054849290611599908490611d50565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611156565b6000610ca26360fa067f611828565b6000730d0e7c27d25160231a4ce475cb9b296a41aea329610ca2565b60006116128261099a565b92915050565b610c31838383611253565b600080826001600160a01b0316846001600160a01b031614156116965760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016105e0565b826001600160a01b0316846001600160a01b0316106116b65782846116b9565b83835b90925090506001600160a01b0382166117145760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016105e0565b9250929050565b60003330141561177257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506105309050565b503390565b6000604051806080016040528060438152602001611e1660439139805160209182012083518483015160408087015180519086012090516117d7950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000805460405161190160f01b60208201526022810191909152604281018390526062016117d7565b610c3183838361183a565b600061161261183683421190565b1590565b6118426115dc565b15610c3157600754600160a01b900460ff1661185d57610c31565b6118656115eb565b6001600160a01b0316630336a33061187b610c45565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528187166024820152908516604482015260648101849052608401600060405180830381600087803b1580156118d357600080fd5b505af11580156118e7573d6000803e3d6000fd5b50505050505050565b80356001600160a01b03811681146109b457600080fd5b60008083601f840112611918578081fd5b50813567ffffffffffffffff81111561192f578182fd5b6020830191508360208260051b850101111561171457600080fd5b803560ff811681146109b457600080fd5b60006020828403121561196c578081fd5b611975826118f0565b9392505050565b6000806040838503121561198e578081fd5b611997836118f0565b91506119a5602084016118f0565b90509250929050565b6000806000606084860312156119c2578081fd5b6119cb846118f0565b92506119d9602085016118f0565b9150604084013590509250925092565b600080600080600060a08688031215611a00578081fd5b611a09866118f0565b9450602086013567ffffffffffffffff80821115611a25578283fd5b818801915088601f830112611a38578283fd5b813581811115611a4a57611a4a611dff565b604051601f8201601f19908116603f01168101908382118183101715611a7257611a72611dff565b816040528281528b6020848701011115611a8a578586fd5b8260208601602083013791820160200185905250955050506040860135925060608601359150611abc6080870161194a565b90509295509295909350565b60008060408385031215611ada578182fd5b611ae3836118f0565b946020939093013593505050565b60008060208385031215611b03578182fd5b823567ffffffffffffffff811115611b19578283fd5b611b2585828601611907565b90969095509350505050565b600080600060408486031215611b45578283fd5b833567ffffffffffffffff811115611b5b578384fd5b611b6786828701611907565b9094509250611b7a9050602085016118f0565b90509250925092565b600060208284031215611b94578081fd5b81518015158114611975578182fd5b600060208284031215611bb4578081fd5b5035919050565b60008151808452611bd3816020860160208601611d67565b601f01601f19169290920160200192915050565b60008251611bf9818460208701611d67565b9190910192915050565b60008351611c15818460208801611d67565b60609390931b6001600160601b0319169190920190815260140192915050565b6001600160f81b0319815260609390931b6001600160601b03191660018401526015830191909152603582015260550190565b6001600160a01b03848116825283166020820152606060408201819052600090611c9490830184611bbb565b95945050505050565b6000602082526119756020830184611bbb565b60208082526033908201527f5573696e674c697175696469747950726f74656374696f6e536572766963653a604082015272081c1c9bdd1958dd1a5bdb881c995b5bdd9959606a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d4b57611d4b611de9565b500190565b600082821015611d6257611d62611de9565b500390565b60005b83811015611d82578181015183820152602001611d6a565b838111156109945750506000910152565b600181811c90821680611da757607f821691505b60208210811415611dc857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611de257611de2611de9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122039488ec7d79942096c211fa1f9771945e9bd64c9c70dfd39ae91d9ac764d1e6464736f6c63430008030033

Deployed Bytecode Sourcemap

33002:2404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10886:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13167:210;;;;;;;;;;-1:-1:-1;13167:210:0;;;;;:::i;:::-;;:::i;:::-;;;8761:14:1;;8754:22;8736:41;;8724:2;8709:18;13167:210:0;8691:92:1;5137:1148:0;;;;;;:::i;:::-;;:::i;11979:108::-;;;;;;;;;;-1:-1:-1;12067:12:0;;11979:108;;;8934:25:1;;;8922:2;8907:18;11979:108:0;8889:76:1;3841:101:0;;;;;;;;;;-1:-1:-1;3892:7:0;3919:15;3841:101;;13859:493;;;;;;;;;;-1:-1:-1;13859:493:0;;;;;:::i;:::-;;:::i;6711:107::-;;;;;;;;;;-1:-1:-1;6711:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;6798:12:0;6764:13;6798:12;;;:6;:12;;;;;;;6711:107;11830:84;;;;;;;;;;-1:-1:-1;11830:84:0;;11904:2;18207:36:1;;18195:2;18180:18;11830:84:0;18162:87:1;3950:91:0;;;;;;;;;;-1:-1:-1;4020:13:0;3950:91;;14761:297;;;;;;;;;;-1:-1:-1;14761:297:0;;;;;:::i;:::-;;:::i;30964:96::-;;;;;;;;;;;;;:::i;:::-;;20551:91;;;;;;;;;;-1:-1:-1;20551:91:0;;;;;:::i;:::-;;:::i;31068:85::-;;;;;;;;;;;;31136:9;;-1:-1:-1;;;31136:9:0;;;;;31068:85;30538:418;;;;;;;;;;-1:-1:-1;30538:418:0;;;;;:::i;:::-;;:::i;12150:177::-;;;;;;;;;;-1:-1:-1;12150:177:0;;;;;:::i;:::-;;:::i;23020:148::-;;;;;;;;;;;;;:::i;29914:616::-;;;;;;;;;;-1:-1:-1;29914:616:0;;;;;:::i;:::-;;:::i;20961:369::-;;;;;;;;;;-1:-1:-1;20961:369:0;;;;;:::i;:::-;;:::i;22369:87::-;;;;;;;;;;-1:-1:-1;22442:6:0;;-1:-1:-1;;;;;22442:6:0;22369:87;;;-1:-1:-1;;;;;6953:32:1;;;6935:51;;6923:2;6908:18;22369:87:0;6890:102:1;11096:95:0;;;;;;;;;;;;;:::i;32178:817::-;;;;;;;;;;;;;:::i;15561:446::-;;;;;;;;;;-1:-1:-1;15561:446:0;;;;;:::i;:::-;;:::i;12540:216::-;;;;;;;;;;-1:-1:-1;12540:216:0;;;;;:::i;:::-;;:::i;12819:201::-;;;;;;;;;;-1:-1:-1;12819:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;12985:18:0;;;12953:7;12985:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12819:201;23323:281;;;;;;;;;;-1:-1:-1;23323:281:0;;;;;:::i;:::-;;:::i;10886:91::-;10931:13;10964:5;10957:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10886:91;;:::o;13167:210::-;13286:4;13308:39;13317:12;:10;:12::i;:::-;13331:7;13340:6;13308:8;:39::i;:::-;-1:-1:-1;13365:4:0;13167:210;;;;:::o;5137:1148::-;5395:152;;;5338:12;5395:152;;;;;-1:-1:-1;;;;;5433:19:0;;5363:29;5433:19;;;:6;:19;;;;;;;;;5395:152;;;;;;;;;;;5582:45;5440:11;5395:152;5610:4;5616;5622;5582:6;:45::i;:::-;5560:128;;;;-1:-1:-1;;;5560:128:0;;15300:2:1;5560:128:0;;;15282:21:1;15339:2;15319:18;;;15312:30;15378:34;15358:18;;;15351:62;-1:-1:-1;;;15429:18:1;;;15422:31;15470:19;;5560:128:0;;;;;;;;;-1:-1:-1;;;;;5777:19:0;;;;;;:6;:19;;;;;;;;;:23;;;:::i;:::-;-1:-1:-1;;;;;5755:19:0;;;;;;:6;:19;;;;;;;:45;;;;5818:126;;;;;5762:11;;5890:10;;5916:17;;5818:126;:::i;:::-;;;;;;;;6055:12;6069:23;6104:4;-1:-1:-1;;;;;6096:18:0;6146:17;6165:11;6129:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6129:48:0;;;;;;;;;;6096:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6054:134;;;;6207:7;6199:48;;;;-1:-1:-1;;;6199:48:0;;12954:2:1;6199:48:0;;;12936:21:1;12993:2;12973:18;;;12966:30;13032;13012:18;;;13005:58;13080:18;;6199:48:0;12926:178:1;6199:48:0;6267:10;5137:1148;-1:-1:-1;;;;;;;;5137:1148:0:o;13859:493::-;13999:4;14016:36;14026:6;14034:9;14045:6;14016:9;:36::i;:::-;-1:-1:-1;;;;;14092:19:0;;14065:24;14092:19;;;:11;:19;;;;;14065:24;14112:12;:10;:12::i;:::-;-1:-1:-1;;;;;14092:33:0;-1:-1:-1;;;;;14092:33:0;;;;;;;;;;;;;14065:60;;14178:6;14158:16;:26;;14136:116;;;;-1:-1:-1;;;14136:116:0;;14530:2:1;14136:116:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:38;14707:19;;14136:116:0;14502:230:1;14136:116:0;14263:57;14272:6;14280:12;:10;:12::i;:::-;14294:25;14313:6;14294:16;:25;:::i;:::-;14263:8;:57::i;:::-;-1:-1:-1;14340:4:0;;13859:493;-1:-1:-1;;;;13859:493:0:o;14761:297::-;14876:4;14898:130;14921:12;:10;:12::i;:::-;14948:7;15007:10;14970:11;:25;14982:12;:10;:12::i;:::-;-1:-1:-1;;;;;14970:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14970:25:0;;;:34;;;;;;;;;;:47;;;;:::i;30964:96::-;28231:22;:20;:22::i;:::-;31035:9:::1;:17:::0;;-1:-1:-1;;;;31035:17:0::1;::::0;;30964:96::o;20551:91::-;20607:27;20613:12;:10;:12::i;:::-;20627:6;20607:5;:27::i;:::-;20551:91;:::o;30538:418::-;28231:22;:20;:22::i;:::-;30691:19:::1;:17;:19::i;:::-;30669:120;;;;-1:-1:-1::0;;;30669:120:0::1;;;;;;;:::i;:::-;30800:12;30815:18;:16;:18::i;:::-;30800:33;;30849:9;30844:105;30864:19:::0;;::::1;30844:105;;;30905:5;:3;:5::i;:::-;-1:-1:-1::0;;;;;30905:13:0::1;;30919:4;30925:8;;30934:1;30925:11;;;;;-1:-1:-1::0;;;30925:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30905:32;::::0;-1:-1:-1;;;;;;30905:32:0::1;::::0;;;;;;-1:-1:-1;;;;;7227:15:1;;;30905:32:0::1;::::0;::::1;7209:34:1::0;7279:15;;7259:18;;;7252:43;7144:18;;30905:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30885:3;;;;;:::i;:::-;;;;30844:105;;;;28264:1;30538:418:::0;;:::o;12150:177::-;-1:-1:-1;;;;;12301:18:0;;12269:7;12301:18;;;:9;:18;;;;;;12150:177;;;;:::o;23020:148::-;22600:12;:10;:12::i;:::-;-1:-1:-1;;;;;22589:23:0;:7;22442:6;;-1:-1:-1;;;;;22442:6:0;22369:87;;22589:7;-1:-1:-1;;;;;22589:23:0;;22581:68;;;;-1:-1:-1;;;22581:68:0;;;;;;;:::i;:::-;23111:6:::1;::::0;23090:40:::1;::::0;23127:1:::1;::::0;-1:-1:-1;;;;;23111:6:0::1;::::0;23090:40:::1;::::0;23127:1;;23090:40:::1;23141:6;:19:::0;;-1:-1:-1;;;;;;23141:19:0::1;::::0;;23020:148::o;29914:616::-;28231:22;:20;:22::i;:::-;30072:19:::1;:17;:19::i;:::-;30050:120;;;;-1:-1:-1::0;;;30050:120:0::1;;;;;;;:::i;:::-;30181:9;:17:::0;;-1:-1:-1;;;;30181:17:0::1;::::0;;30193:5:::1;30224:18;:16;:18::i;:::-;30209:33;;30258:9;30253:243;30273:19:::0;;::::1;30253:243;;;30314:14;30331:8;;30340:1;30331:11;;;;;-1:-1:-1::0;;;30331:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30314:28;;30361:5;:3;:5::i;:::-;:29;::::0;-1:-1:-1;;;30361:29:0;;-1:-1:-1;;;;;7227:15:1;;;30361:29:0::1;::::0;::::1;7209:34:1::0;7279:15;;;7259:18;;;7252:43;30361:15:0;;;::::1;::::0;::::1;::::0;7144:18:1;;30361:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30357:128;;;30411:58;30426:6;30434:9;30445:23;30461:6;30445:15;:23::i;:::-;30411:14;:58::i;:::-;-1:-1:-1::0;30294:3:0;::::1;::::0;::::1;:::i;:::-;;;;30253:243;;;-1:-1:-1::0;;30506:9:0::1;:16:::0;;-1:-1:-1;;;;30506:16:0::1;-1:-1:-1::0;;;30506:16:0::1;::::0;;-1:-1:-1;;;29914:616:0:o;20961:369::-;21038:24;21065:32;21075:7;21084:12;:10;:12::i;21065:32::-;21038:59;;21150:6;21130:16;:26;;21108:112;;;;-1:-1:-1;;;21108:112:0;;15702:2:1;21108:112:0;;;15684:21:1;15741:2;15721:18;;;15714:30;15780:34;15760:18;;;15753:62;-1:-1:-1;;;15831:18:1;;;15824:34;15875:19;;21108:112:0;15674:226:1;21108:112:0;21231:58;21240:7;21249:12;:10;:12::i;:::-;21263:25;21282:6;21263:16;:25;:::i;21231:58::-;21300:22;21306:7;21315:6;21300:5;:22::i;:::-;20961:369;;;:::o;11096:95::-;11143:13;11176:7;11169:14;;;;;:::i;32178:817::-;32227:7;32329:194;27712:66;34212:42;32462:4;35242:42;32329:24;:194::i;:::-;32305:218;;;;32718:269;32698:289;;32178:817;:::o;15561:446::-;15681:4;15703:24;15730:11;:25;15742:12;:10;:12::i;:::-;-1:-1:-1;;;;;15730:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15730:25:0;;;:34;;;;;;;;;;;-1:-1:-1;15797:35:0;;;;15775:122;;;;-1:-1:-1;;;15775:122:0;;17679:2:1;15775:122:0;;;17661:21:1;17718:2;17698:18;;;17691:30;17757:34;17737:18;;;17730:62;-1:-1:-1;;;17808:18:1;;;17801:35;17853:19;;15775:122:0;17651:227:1;15775:122:0;15908:67;15917:12;:10;:12::i;:::-;15931:7;15940:34;15959:15;15940:16;:34;:::i;15908:67::-;-1:-1:-1;15995:4:0;;15561:446;-1:-1:-1;;;15561:446:0:o;12540:216::-;12662:4;12684:42;12694:12;:10;:12::i;:::-;12708:9;12719:6;12684:9;:42::i;23323:281::-;22600:12;:10;:12::i;:::-;-1:-1:-1;;;;;22589:23:0;:7;22442:6;;-1:-1:-1;;;;;22442:6:0;22369:87;;22589:7;-1:-1:-1;;;;;22589:23:0;;22581:68;;;;-1:-1:-1;;;22581:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23426:22:0;::::1;23404:110;;;::::0;-1:-1:-1;;;23404:110:0;;12144:2:1;23404:110:0::1;::::0;::::1;12126:21:1::0;12183:2;12163:18;;;12156:30;12222:34;12202:18;;;12195:62;-1:-1:-1;;;12273:18:1;;;12266:36;12319:19;;23404:110:0::1;12116:228:1::0;23404:110:0::1;23551:6;::::0;23530:38:::1;::::0;-1:-1:-1;;;;;23530:38:0;;::::1;::::0;23551:6:::1;::::0;23530:38:::1;::::0;23551:6:::1;::::0;23530:38:::1;23579:6;:17:::0;;-1:-1:-1;;;;;;23579:17:0::1;-1:-1:-1::0;;;;;23579:17:0;;;::::1;::::0;;;::::1;::::0;;23323:281::o;24290:702::-;24444:12;24470:14;24486;24504:26;24515:6;24523;24504:10;:26::i;:::-;24795:32;;-1:-1:-1;;;;;;5074:2:1;5070:15;;;5066:24;;24795:32:0;;;5054:37:1;5125:15;;;5121:24;5107:12;;;5100:46;24469:61:0;;-1:-1:-1;24469:61:0;-1:-1:-1;24747:7:0;;5162:12:1;;24795:32:0;;;;;;;;;;;;24785:43;;;;;;24859:12;24662:254;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;24662:254:0;;;;;;;;;24626:313;;24662:254;24626:313;;;;;24290:702;-1:-1:-1;;;;;;;24290:702:0:o;25914:281::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26075:6:0;-1:-1:-1;;;;;26066:15:0;:6;-1:-1:-1;;;;;26066:15:0;;26062:56;;;26103:6;;26111;26062:56;-1:-1:-1;26136:51:0;;;;;;;;-1:-1:-1;;;;;26136:51:0;;;;;;;;;;;;;;;;;;;;;;;25914:281::o;26448:699::-;26559:12;26610:3;:10;;;-1:-1:-1;;;;;26597:23:0;:3;:10;;;-1:-1:-1;;;;;26597:23:0;;26589:32;;;;;;26931:10;;26943;;;;;26955:7;;;;;26920:43;;-1:-1:-1;;;;;8459:15:1;;;26920:43:0;;;8441:34:1;8511:15;;;;8491:18;;;8484:43;8575:8;8563:21;;;8543:18;;;;8536:49;;;;26920:43:0;;;;;;;;;;8376:18:1;;;26920:43:0;;;26876:118;;;;;26753:318;;26838:7;;26876:118;25357:66;;26753:318;;;:::i;:::-;;;;-1:-1:-1;;26753:318:0;;;;;;;;;26717:377;;26753:318;26717:377;;;;;26448:699;-1:-1:-1;;;26448:699:0:o;8537:99::-;8590:7;8617:11;:9;:11::i;19057:380::-;-1:-1:-1;;;;;19193:19:0;;19185:68;;;;-1:-1:-1;;;19185:68:0;;16915:2:1;19185:68:0;;;16897:21:1;16954:2;16934:18;;;16927:30;16993:34;16973:18;;;16966:62;-1:-1:-1;;;17044:18:1;;;17037:34;17088:19;;19185:68:0;16887:226:1;19185:68:0;-1:-1:-1;;;;;19272:21:0;;19264:68;;;;-1:-1:-1;;;19264:68:0;;12551:2:1;19264:68:0;;;12533:21:1;12590:2;12570:18;;;12563:30;12629:34;12609:18;;;12602:62;-1:-1:-1;;;12680:18:1;;;12673:32;12722:19;;19264:68:0;12523:224:1;19264:68:0;-1:-1:-1;;;;;19345:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19397:32;;8934:25:1;;;19397:32:0;;8907:18:1;19397:32:0;;;;;;;;19057:380;;;:::o;6826:486::-;7004:4;-1:-1:-1;;;;;7029:20:0;;7021:70;;;;-1:-1:-1;;;7021:70:0;;14124:2:1;7021:70:0;;;14106:21:1;14163:2;14143:18;;;14136:30;14202:34;14182:18;;;14175:62;-1:-1:-1;;;14253:18:1;;;14246:35;14298:19;;7021:70:0;14096:227:1;7021:70:0;7145:159;7173:47;7192:27;7212:6;7192:19;:27::i;:::-;7173:18;:47::i;:::-;7145:159;;;;;;;;;;;;9619:25:1;;;;9692:4;9680:17;;9660:18;;;9653:45;9714:18;;;9707:34;;;9757:18;;;9750:34;;;9591:19;;7145:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7122:182:0;:6;-1:-1:-1;;;;;7122:182:0;;7102:202;;6826:486;;;;;;;:::o;16497:675::-;-1:-1:-1;;;;;16637:20:0;;16629:70;;;;-1:-1:-1;;;16629:70:0;;16509:2:1;16629:70:0;;;16491:21:1;16548:2;16528:18;;;16521:30;16587:34;16567:18;;;16560:62;-1:-1:-1;;;16638:18:1;;;16631:35;16683:19;;16629:70:0;16481:227:1;16629:70:0;-1:-1:-1;;;;;16718:23:0;;16710:71;;;;-1:-1:-1;;;16710:71:0;;10443:2:1;16710:71:0;;;10425:21:1;10482:2;10462:18;;;10455:30;10521:34;10501:18;;;10494:62;-1:-1:-1;;;10572:18:1;;;10565:33;10615:19;;16710:71:0;10415:225:1;16710:71:0;16794:47;16815:6;16823:9;16834:6;16794:20;:47::i;:::-;-1:-1:-1;;;;;16878:17:0;;16854:21;16878:17;;;:9;:17;;;;;;16928:23;;;;16906:111;;;;-1:-1:-1;;;16906:111:0;;13311:2:1;16906:111:0;;;13293:21:1;13350:2;13330:18;;;13323:30;13389:34;13369:18;;;13362:62;-1:-1:-1;;;13440:18:1;;;13433:36;13486:19;;16906:111:0;13283:228:1;16906:111:0;17048:22;17064:6;17048:13;:22;:::i;:::-;-1:-1:-1;;;;;17028:17:0;;;;;;;:9;:17;;;;;;:42;;;;17081:20;;;;;;;;:30;;17105:6;;17028:17;17081:30;;17105:6;;17081:30;:::i;:::-;;;;;;;;17146:9;-1:-1:-1;;;;;17129:35:0;17138:6;-1:-1:-1;;;;;17129:35:0;;17157:6;17129:35;;;;8934:25:1;;8922:2;8907:18;;8889:76;17129:35:0;;;;;;;;16497:675;;;;:::o;33541:67::-;22600:12;:10;:12::i;:::-;-1:-1:-1;;;;;22589:23:0;:7;22442:6;;-1:-1:-1;;;;;22442:6:0;22369:87;;22589:7;-1:-1:-1;;;;;22589:23:0;;22581:68;;;;-1:-1:-1;;;22581:68:0;;;;;;;:::i;:::-;33541:67::o;18125:494::-;-1:-1:-1;;;;;18209:21:0;;18201:67;;;;-1:-1:-1;;;18201:67:0;;16107:2:1;18201:67:0;;;16089:21:1;16146:2;16126:18;;;16119:30;16185:34;16165:18;;;16158:62;-1:-1:-1;;;16236:18:1;;;16229:31;16277:19;;18201:67:0;16079:223:1;18201:67:0;18281:49;18302:7;18319:1;18323:6;18281:20;:49::i;:::-;-1:-1:-1;;;;;18368:18:0;;18343:22;18368:18;;;:9;:18;;;;;;18405:24;;;;18397:71;;;;-1:-1:-1;;;18397:71:0;;11267:2:1;18397:71:0;;;11249:21:1;11306:2;11286:18;;;11279:30;11345:34;11325:18;;;11318:62;-1:-1:-1;;;11396:18:1;;;11389:32;11438:19;;18397:71:0;11239:224:1;18397:71:0;18500:23;18517:6;18500:14;:23;:::i;:::-;-1:-1:-1;;;;;18479:18:0;;;;;;:9;:18;;;;;:44;;;;18534:12;:22;;18550:6;;18479:18;18534:22;;18550:6;;18534:22;:::i;:::-;;;;-1:-1:-1;;18574:37:0;;8934:25:1;;;18600:1:0;;-1:-1:-1;;;;;18574:37:0;;;;;8922:2:1;8907:18;18574:37:0;8889:76:1;34676:427:0;34736:4;34760:38;34787:10;34760:26;:38::i;29338:105::-;29375:5;33785:42;29406:28;33647:188;33331:202;33441:7;33473:18;33483:7;33473:9;:18::i;:::-;33466:25;33331:202;-1:-1:-1;;33331:202:0:o;33108:215::-;33240:30;33250:5;33257:3;33262:7;33240:9;:30::i;23791:407::-;23893:14;23909;23959:6;-1:-1:-1;;;;;23949:16:0;:6;-1:-1:-1;;;;;23949:16:0;;;23941:66;;;;-1:-1:-1;;;23941:66:0;;13718:2:1;23941:66:0;;;13700:21:1;13757:2;13737:18;;;13730:30;13796:34;13776:18;;;13769:62;-1:-1:-1;;;13847:18:1;;;13840:35;13892:19;;23941:66:0;13690:227:1;23941:66:0;24046:6;-1:-1:-1;;;;;24037:15:0;:6;-1:-1:-1;;;;;24037:15:0;;:79;;24101:6;24109;24037:79;;;24069:6;24077;24037:79;24018:98;;-1:-1:-1;24018:98:0;-1:-1:-1;;;;;;24135:20:0;;24127:63;;;;-1:-1:-1;;;24127:63:0;;17320:2:1;24127:63:0;;;17302:21:1;17359:2;17339:18;;;17332:30;17398:32;17378:18;;;17371:60;17448:18;;24127:63:0;17292:180:1;24127:63:0;23791:407;;;;;:::o;7357:618::-;7401:22;7440:10;7462:4;7440:27;7436:508;;;7484:18;7505:8;;7484:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;7544:8:0;7755:17;7749:24;-1:-1:-1;;;;;7723:134:0;;-1:-1:-1;7583:289:0;;-1:-1:-1;7583:289:0;;-1:-1:-1;7921:10:0;7357:618;:::o;6293:410::-;6403:7;4461:108;;;;;;;;;;;;;;;;;4437:143;;;;;;;6557:12;;6592:11;;;;6636:24;;;;;6626:35;;;;;;6476:204;;;;;9201:25:1;;;9257:2;9242:18;;9235:34;;;;-1:-1:-1;;;;;9305:32:1;9300:2;9285:18;;9278:60;9369:2;9354:18;;9347:34;9188:3;9173:19;;9155:232;6476:204:0;;;;;;;;;;;;;6448:247;;;;;;6428:267;;6293:410;;;:::o;4049:258::-;4148:7;3919:15;;4221:63;;-1:-1:-1;;;4221:63:0;;;6142:27:1;6185:11;;;6178:27;;;;6221:12;;;6214:28;;;6258:12;;4221:63:0;6132:144:1;34270:264:0;34466:60;34506:5;34513:3;34518:7;34466:39;:60::i;31268:166::-;31374:4;31403:23;31407:18;31414:10;31826:15;-1:-1:-1;31813:28:0;31730:119;31407:18;31934:11;;31857:96;29451:455;29611:19;:17;:19::i;:::-;29607:292;;;29652:9;;-1:-1:-1;;;29652:9:0;;;;29647:57;;29682:7;;29647:57;29718:5;:3;:5::i;:::-;-1:-1:-1;;;;;29718:45:0;;29782:18;:16;:18::i;:::-;29718:169;;-1:-1:-1;;;;;;29718:169:0;;;;;;;-1:-1:-1;;;;;8029:15:1;;;29718:169:0;;;8011:34:1;8081:15;;;8061:18;;;8054:43;8133:15;;;8113:18;;;8106:43;8165:18;;;8158:34;;;7945:19;;29718:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29451:455;;;:::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:1248::-;;;;;;1755:3;1743:9;1734:7;1730:23;1726:33;1723:2;;;1777:6;1769;1762:22;1723:2;1805:29;1824:9;1805:29;:::i;:::-;1795:39;;1885:2;1874:9;1870:18;1857:32;1908:18;1949:2;1941:6;1938:14;1935:2;;;1970:6;1962;1955:22;1935:2;2013:6;2002:9;1998:22;1988:32;;2058:7;2051:4;2047:2;2043:13;2039:27;2029:2;;2085:6;2077;2070:22;2029:2;2126;2113:16;2148:2;2144;2141:10;2138:2;;;2154:18;;:::i;:::-;2229:2;2223:9;2197:2;2283:13;;-1:-1:-1;;2279:22:1;;;2303:2;2275:31;2271:40;2259:53;;;2327:18;;;2347:22;;;2324:46;2321:2;;;2373:18;;:::i;:::-;2413:10;2409:2;2402:22;2448:2;2440:6;2433:18;2488:7;2483:2;2478;2474;2470:11;2466:20;2463:33;2460:2;;;2514:6;2506;2499:22;2460:2;2575;2570;2566;2562:11;2557:2;2549:6;2545:15;2532:46;2598:15;;;2615:2;2594:24;2587:40;;;-1:-1:-1;2602:6:1;-1:-1:-1;;;2699:2:1;2684:18;;2671:32;;-1:-1:-1;2750:2:1;2735:18;;2722:32;;-1:-1:-1;2773:37:1;2805:3;2790:19;;2773:37;:::i;:::-;2763:47;;1713:1103;;;;;;;;:::o;2821:264::-;;;2950:2;2938:9;2929:7;2925:23;2921:32;2918:2;;;2971:6;2963;2956:22;2918:2;2999:29;3018:9;2999:29;:::i;:::-;2989:39;3075:2;3060:18;;;;3047:32;;-1:-1:-1;;;2908:177:1:o;3090:457::-;;;3237:2;3225:9;3216:7;3212:23;3208:32;3205:2;;;3258:6;3250;3243:22;3205:2;3303:9;3290:23;3336:18;3328:6;3325:30;3322:2;;;3373:6;3365;3358:22;3322:2;3417:70;3479:7;3470:6;3459:9;3455:22;3417:70;:::i;:::-;3506:8;;3391:96;;-1:-1:-1;3195:352:1;-1:-1:-1;;;;3195:352:1:o;3552:531::-;;;;3716:2;3704:9;3695:7;3691:23;3687:32;3684:2;;;3737:6;3729;3722:22;3684:2;3782:9;3769:23;3815:18;3807:6;3804:30;3801:2;;;3852:6;3844;3837:22;3801:2;3896:70;3958:7;3949:6;3938:9;3934:22;3896:70;:::i;:::-;3985:8;;-1:-1:-1;3870:96:1;-1:-1:-1;4039:38:1;;-1:-1:-1;4073:2:1;4058:18;;4039:38;:::i;:::-;4029:48;;3674:409;;;;;:::o;4088:297::-;;4208:2;4196:9;4187:7;4183:23;4179:32;4176:2;;;4229:6;4221;4214:22;4176:2;4266:9;4260:16;4319:5;4312:13;4305:21;4298:5;4295:32;4285:2;;4346:6;4338;4331:22;4390:190;;4502:2;4490:9;4481:7;4477:23;4473:32;4470:2;;;4523:6;4515;4508:22;4470:2;-1:-1:-1;4551:23:1;;4460:120;-1:-1:-1;4460:120:1:o;4585:257::-;;4664:5;4658:12;4691:6;4686:3;4679:19;4707:63;4763:6;4756:4;4751:3;4747:14;4740:4;4733:5;4729:16;4707:63;:::i;:::-;4824:2;4803:15;-1:-1:-1;;4799:29:1;4790:39;;;;4831:4;4786:50;;4634:208;-1:-1:-1;;4634:208:1:o;5185:274::-;;5352:6;5346:13;5368:53;5414:6;5409:3;5402:4;5394:6;5390:17;5368:53;:::i;:::-;5437:16;;;;;5322:137;-1:-1:-1;;5322:137:1:o;5464:415::-;;5659:6;5653:13;5675:53;5721:6;5716:3;5709:4;5701:6;5697:17;5675:53;:::i;:::-;5797:2;5793:15;;;;-1:-1:-1;;;;;;5789:53:1;5750:16;;;;5775:68;;;5870:2;5859:14;;5629:250;-1:-1:-1;;5629:250:1:o;6281:503::-;-1:-1:-1;;;;;;6567:26:1;;6630:2;6626:15;;;;-1:-1:-1;;;;;;6622:53:1;6618:1;6609:11;;6602:74;6701:2;6692:12;;6685:28;;;;6738:2;6729:12;;6722:28;6775:2;6766:12;;6557:227::o;7306:431::-;-1:-1:-1;;;;;7563:15:1;;;7545:34;;7615:15;;7610:2;7595:18;;7588:43;7667:2;7662;7647:18;;7640:30;;;7306:431;;7687:44;;7712:18;;7704:6;7687:44;:::i;:::-;7679:52;7497:240;-1:-1:-1;;;;;7497:240:1:o;9795:217::-;;9942:2;9931:9;9924:21;9962:44;10002:2;9991:9;9987:18;9979:6;9962:44;:::i;10645:415::-;10847:2;10829:21;;;10886:2;10866:18;;;10859:30;10925:34;10920:2;10905:18;;10898:62;-1:-1:-1;;;10991:2:1;10976:18;;10969:49;11050:3;11035:19;;10819:241::o;14737:356::-;14939:2;14921:21;;;14958:18;;;14951:30;15017:34;15012:2;14997:18;;14990:62;15084:2;15069:18;;14911:182::o;18254:128::-;;18325:1;18321:6;18318:1;18315:13;18312:2;;;18331:18;;:::i;:::-;-1:-1:-1;18367:9:1;;18302:80::o;18387:125::-;;18455:1;18452;18449:8;18446:2;;;18460:18;;:::i;:::-;-1:-1:-1;18497:9:1;;18436:76::o;18517:258::-;18589:1;18599:113;18613:6;18610:1;18607:13;18599:113;;;18689:11;;;18683:18;18670:11;;;18663:39;18635:2;18628:10;18599:113;;;18730:6;18727:1;18724:13;18721:2;;;-1:-1:-1;;18765:1:1;18747:16;;18740:27;18570:205::o;18780:380::-;18859:1;18855:12;;;;18902;;;18923:2;;18977:4;18969:6;18965:17;18955:27;;18923:2;19030;19022:6;19019:14;18999:18;18996:38;18993:2;;;19076:10;19071:3;19067:20;19064:1;19057:31;19111:4;19108:1;19101:15;19139:4;19136:1;19129:15;18993:2;;18835:325;;;:::o;19165:135::-;;-1:-1:-1;;19225:17:1;;19222:2;;;19245:18;;:::i;:::-;-1:-1:-1;19292:1:1;19281:13;;19212:88::o;19305:127::-;19366:10;19361:3;19357:20;19354:1;19347:31;19397:4;19394:1;19387:15;19421:4;19418:1;19411:15;19437:127;19498:10;19493:3;19489:20;19486:1;19479:31;19529:4;19526:1;19519:15;19553:4;19550:1;19543:15

Swarm Source

ipfs://39488ec7d79942096c211fa1f9771945e9bd64c9c70dfd39ae91d9ac764d1e64
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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