ETH Price: $3,350.84 (+0.39%)
 

Overview

TokenID

146

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
Jelly7616

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 10000 runs

Other Settings:
paris EvmVersion
File 1 of 7 : Jelly7616.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;

import { ERC7616 } from "./ERC7616.sol";
import { console2 } from "forge-std/src/console2.sol";
import { IJelly7616 } from "./interfaces/IJelly7616.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

// owner should be in whitelist & should approve all token to this contract
// 21,000 blocks in total, which shuold be
// 21,000 * 13.5 / 60/ 60 = 78.75 hours
contract Jelly7616 is ERC7616, IJelly7616 {
    uint256 public constant MINT_PRICE = 0.01 ether;
    uint256 public constant EPOCH_BLOCKS = 200;
    uint256 public constant TOTAL_QUOTA_EACH_EPOCH = 25_000 ether;
    uint256 public constant MAX_EPOCH = 40;
    uint256 public currentEpoch = 0;
    uint256 public currentEpochEndBlock;
    address payable teamAddress;
    string public dataURI;
    string public baseTokenURI;
    uint256 public startBlock;

    // epoch => address => minted amt
    mapping(uint256 => mapping(address => uint256)) public minters;
    // epoch => total minted amt
    mapping(uint256 => uint256) public totalMinted;
    // epoch => address => isRewardClaimed
    mapping(uint256 => mapping(address => bool)) public isClaimed;
    // epoch => sharePerMint
    mapping(uint256 => uint256) public EpochSharePerMint;
    // tokenId => attribute
    mapping(uint256 => uint256) public tokenAttributes;

    error NoEnoughEth();
    error MaxEpochsReached();
    error StartBlockAlreadySet();
    error MintIsNotStarted();
    error NotEligible();
    error EpochNotEnded();
    error AlreadyClaimed();

    event JellyMinted(address indexed minter, uint256 indexed epoch);
    event JellyBatchMinted(address indexed minter, uint256 indexed epoch, uint256 amount);
    event JellyClaimed(address indexed minter, uint256 indexed epoch, uint256 amount);
    event EpochEnded(uint256 indexed epoch, uint256 totalMinted, uint256 sharePerMint);

    constructor(address teamAddress_, address _owner) ERC7616("Jelly", "JELLY", 18, 10_000, _owner) {
        teamAddress = payable(teamAddress_);

        whitelist[teamAddress_] = true;
        whitelist[address(0)] = true;

        if (teamAddress_ != _owner) {
            whitelist[_owner] = true;
        }
    }

    function setStartBlock(uint256 blockNumber_) external onlyOwner {
        startBlock = blockNumber_;
        currentEpochEndBlock = blockNumber_ + EPOCH_BLOCKS;
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(string memory _name, string memory _symbol) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    function mint() public payable {
        // Perform all minting checks
        performMintingChecks();

        // Perform the mint operation for 1 quantity
        performMint(1);
    }

    function batchMint(uint256 quantity) public payable {
        require(quantity > 0, "Quantity must be greater than 0");

        // Perform all minting checks for the requested quantity
        performMintingChecks();

        // Perform the mint operation for the requested quantity
        performMint(quantity);

        // Emit event for minting
        emit JellyBatchMinted(msg.sender, currentEpoch, quantity);
    }

    function performMintingChecks() internal {
        if (block.number < startBlock || startBlock == 0) {
            revert MintIsNotStarted();
        }

        endEpoch();
        if (currentEpoch == MAX_EPOCH) {
            revert MaxEpochsReached();
        }
    }

    function performMint(uint256 quantity) internal {
        uint256 totalPrice = MINT_PRICE * quantity;
        if (msg.value < totalPrice) {
            revert NoEnoughEth();
        }
        uint256 excessAmount = msg.value - totalPrice;

        unchecked {
            minters[currentEpoch][msg.sender] += quantity;
            totalMinted[currentEpoch] += quantity;
        }

        // Return the excess ETH to the sender
        if (excessAmount > 0) {
            payable(msg.sender).transfer(excessAmount);
        }

        teamAddress.transfer(totalPrice);
    }

    function getTotalClaimableAmount(address _owner) public view returns (uint256) {
        uint256 totalClaimable = 0;
        uint256 curEpoch = getActualCurrentEpoch();

        for (uint256 i = 0; i < curEpoch; i++) {
            if (!isClaimed[i][_owner] && minters[i][_owner] > 0) {
                // Calculate the claimable amount for each unclaimed epoch
                uint256 claimableAmt = minters[i][_owner] * EpochSharePerMint[i];
                totalClaimable += claimableAmt;
            }
        }

        return totalClaimable;
    }

    function getClaimableEpoches(address _owner) public view returns (uint256[] memory) {
        uint256 claimableCount = 0;

        for (uint256 i = 0; i < currentEpoch; i++) {
            if (!isClaimed[i][_owner] && minters[i][_owner] > 0) {
                claimableCount++;
            }
        }

        uint256[] memory claimableEpochs = new uint256[](claimableCount);
        uint256 currentIndex = 0;

        for (uint256 i = 0; i < currentEpoch; i++) {
            if (!isClaimed[i][_owner] && minters[i][_owner] > 0) {
                claimableEpochs[currentIndex] = i;
                currentIndex++;
            }
        }

        return claimableEpochs;
    }

    // todo: we should not allow users to claim more than 256 tokens in 1 block
    // because that would lose the randomness
    function claimToken(uint256[] calldata epoches) public {
        endEpoch();
        uint256 totalClaimable = 0;
        uint256 curEpoch = getActualCurrentEpoch();

        for (uint256 i = 0; i < epoches.length; i++) {
            uint256 epoch = epoches[i];

            if (epoch >= curEpoch) {
                revert EpochNotEnded();
            }

            // check if already claimed
            if (isClaimed[epoch][msg.sender]) {
                revert AlreadyClaimed();
            }

            if (minters[epoch][msg.sender] > 0) {
                // Calculate the claimable amount for each unclaimed epoch
                uint256 claimableAmt = minters[epoch][msg.sender] * EpochSharePerMint[epoch];
                totalClaimable += claimableAmt;
                isClaimed[epoch][msg.sender] = true;

                emit JellyClaimed(msg.sender, epoch, claimableAmt);
            } else {
                revert NotEligible();
            }
        }

        _transfer(address(0), msg.sender, totalClaimable);
    }

    function calculateSharesPerMint(uint256 epoch) internal view returns (uint256) {
        if (totalMinted[epoch] > 0) {
            uint256 sharePerMintAtEpoch = TOTAL_QUOTA_EACH_EPOCH / totalMinted[epoch];
            return sharePerMintAtEpoch;
        } else {
            return 0;
        }
    }

    function endEpoch() internal {
        if (block.number < currentEpochEndBlock) {
            return;
        }

        uint256 sharePerMint = calculateSharesPerMint(currentEpoch);
        EpochSharePerMint[currentEpoch] = sharePerMint;

        emit EpochEnded(currentEpoch, totalMinted[currentEpoch], sharePerMint);

        currentEpoch = getActualCurrentEpoch();

        if (currentEpoch == MAX_EPOCH) {
            return;
        }

        // Update epoch information for the new epoch
        currentEpochEndBlock = startBlock + (getActualCurrentEpoch() + 1) * EPOCH_BLOCKS;
    }

    function getEpochesCollapsed() public view returns (uint256 epochesCollapsed) {
        if (block.number >= currentEpochEndBlock) {
            epochesCollapsed = (block.number - startBlock) / EPOCH_BLOCKS - currentEpoch;
        } else {
            epochesCollapsed = 0;
        }
    }

    function getActualCurrentEpoch() public view returns (uint256) {
        uint256 actualEpoch = currentEpoch + getEpochesCollapsed();

        return actualEpoch < MAX_EPOCH ? actualEpoch : MAX_EPOCH;
    }

    function getActualCurrentEpochStartBlock() public view returns (uint256 actualCurrentEpochStartBlock) {
        actualCurrentEpochStartBlock = startBlock + EPOCH_BLOCKS * getActualCurrentEpoch();
    }

    function getCurrentEpochEndBlock() public view returns (uint256) {
        return getActualCurrentEpochStartBlock() + EPOCH_BLOCKS;
    }

    function _mint(address to) internal virtual override {
        if (to == address(0)) {
            revert("InvalidRecipient");
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert("AlreadyExists");
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);

        // added the following according
        uint256 attribute = getRandomNumber(id);
        tokenAttributes[id] = attribute;
    }

    function getRandomNumber(uint256 tokenId) internal view returns (uint256) {
        return uint256(blockhash(block.number - 1)) + block.timestamp + tokenId;
    }

    function getAttribute(uint256 seed) private pure returns (string memory) {
        bytes memory seedBytes = abi.encodePacked(seed);

        bytes32 hashResult = keccak256(seedBytes);

        uint256 hashedNumber = uint256(hashResult);

        uint256 random = hashedNumber % 256;

        uint256[] memory weights = new uint256[](9);
        string[] memory colors = new string[](9);

        // total weight is 256;
        weights[0] = 50; // Green
        colors[0] = "Green";

        weights[1] = 40; // Orange
        colors[1] = "Orange";

        weights[2] = 35; // Red
        colors[2] = "Red";

        weights[3] = 31; // Pink
        colors[3] = "Pink";

        weights[4] = 30; // Blue
        colors[4] = "Blue";

        weights[5] = 25; // Teal
        colors[5] = "Teal";

        weights[6] = 20; // Purple
        colors[6] = "Purple";

        weights[7] = 15; // Lavender
        colors[7] = "Lavender";

        weights[8] = 10; // Gold
        colors[8] = "Gold";

        uint256 sum = 0;

        for (uint256 i = 0; i < weights.length; i++) {
            sum += weights[i];
            if (random < sum) {
                return colors[i];
            }
        }

        revert("Invalid random number provided.");
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        if (bytes(baseTokenURI).length > 0) {
            return string.concat(baseTokenURI, Strings.toString(id));
        } else {
            uint256 seed = tokenAttributes[id];
            string memory color = getAttribute(seed);
            string memory jsonPreImage = string.concat(
                string.concat(
                    string.concat('{"name": "Jelly #', Strings.toString(id)),
                    '","description":"A collection of 10,000 Replicants enabled by ERC7616, an experimental token standard.","external_url":"https://jelly.top","image":"'
                ),
                string.concat(dataURI, color, ".jpg")
            );
            string memory jsonPostImage = string.concat('","attributes":[{"trait_type":"Color","value":"', color);
            string memory jsonPostTraits = '"}]}';

            return string.concat(
                "data:application/json;utf8,", string.concat(string.concat(jsonPreImage, jsonPostImage), jsonPostTraits)
            );
        }
    }

    fallback() external payable { }

    receive() external payable { }
}

File 2 of 7 : ERC7616.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC7616
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC7616 is Ownable {
    // Events
    event ERC20Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 indexed id);
    event ERC721Approval(address indexed owner, address indexed spender, uint256 indexed id);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();
    error AlreadyWhitelisted();
    error AlreadyUnwhitelisted();
    error NoEnoughNFT();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping. id => index in the _owned array
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    )
        Ownable(_owner)
    {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    function tokenOfOwnerByIndex(address owner_, uint256 index_) public view returns (uint256) {
        return _owned[owner_][index_];
    }

    function nftBalanceOf(address owner) public view virtual returns (uint256) {
        return _owned[owner].length;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        if (state == true) {
            whitelistWithNumOfNFT(target, 0);
        } else {
            unwhitelist(target);
        }
    }

    function whitelistWithNumOfNFT(uint256 num) public {
        whitelistWithNumOfNFT(msg.sender, num);
    }

    function whitelistWithNumOfNFT(address target, uint256 num) internal {
        if (whitelist[target]) {
            revert AlreadyWhitelisted();
        }

        uint256 nftBalance = nftBalanceOf(target);

        if (num > nftBalance) {
            revert NoEnoughNFT();
        }

        whitelist[target] = true;

        uint256 totalBalance = num * _getUnit();

        for (uint256 i = 0; i < nftBalance - num; i++) {
            _burn(target);
        }

        balanceOf[target] -= totalBalance;
        emit ERC20Transfer(target, address(0), totalBalance);
    }

    function unwhitelist() public {
        unwhitelist(msg.sender);
    }

    function unwhitelist(address target) internal {
        if (!whitelist[target]) {
            revert AlreadyUnwhitelisted();
        }

        uint256 totalBalance = nftBalanceOf(target) * _getUnit();

        uint256 tokens_to_mint = (balanceOf[target] / _getUnit());
        for (uint256 i = 0; i < tokens_to_mint; i++) {
            _mint(target);
        }

        _transfer(address(0), msg.sender, totalBalance);

        whitelist[target] = false;
        emit ERC20Transfer(address(0), msg.sender, totalBalance);
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(address spender, uint256 amountOrId) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(address from, address to, uint256 amountOrId) public virtual {
        if (amountOrId <= minted) {
            uint256 unit = _getUnit();

            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) {
                revert Unauthorized();
            }

            if (!whitelist[from]) {
                balanceOf[from] -= unit;
            }

            if (!whitelist[to]) {
                unchecked {
                    balanceOf[to] += unit;
                }
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            if (whitelist[from] && !whitelist[to]) {
                emit ERC20Transfer(address(0), to, unit);
            } else if (!whitelist[from] && whitelist[to]) {
                emit ERC20Transfer(from, address(0), unit);
            } else if (!whitelist[from] && !whitelist[to]) {
                emit ERC20Transfer(from, to, unit);
            }
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max) {
                allowance[from][msg.sender] = allowed - amountOrId;
            }

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(address from, address to, uint256 id) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data)
                    != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        if (from != address(0)) {
            balanceOf[from] -= amount;
        }

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 200 * 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(string memory _name, string memory _symbol) internal {
        name = _name;
        symbol = _symbol;
    }
}

File 3 of 7 : console2.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should
/// use `int256` and `uint256`. This modified version fixes that. This version is recommended
/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in
/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`.
/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178
library console2 {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _castLogPayloadViewToPure(
        function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) internal pure fnOut) {
        assembly {
            fnOut := fnIn
        }
    }

    function _sendLogPayload(bytes memory payload) internal pure {
        _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
    }

    function _sendLogPayloadView(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal pure {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function logUint(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function logString(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function log(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function log(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint256 p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
    }

    function log(uint256 p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
    }

    function log(uint256 p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
    }

    function log(uint256 p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
    }

    function log(string memory p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
    }

    function log(string memory p0, int256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
    }

    function log(bool p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
    }

    function log(address p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

File 4 of 7 : IJelly7616.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.23;

// todo: update
interface IJelly7616 {
    function mint() external payable;
    function getEpochesCollapsed() external view returns (uint256);
    function getActualCurrentEpoch() external view returns (uint256);
    function getActualCurrentEpochStartBlock() external view returns (uint256);
    function getCurrentEpochEndBlock() external view returns (uint256);
}

File 5 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;

import {Math} from "./math/Math.sol";
import {SignedMath} from "./math/SignedMath.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

File 6 of 7 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

File 7 of 7 : SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

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

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@prb/test/=node_modules/@prb/test/",
    "forge-std/=lib/forge-std/",
    "@solvprotocol/=node_modules/@solvprotocol/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "@ensdomains/=node_modules/@ensdomains/",
    "hardhat/=node_modules/hardhat/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"teamAddress_","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"AlreadyUnwhitelisted","type":"error"},{"inputs":[],"name":"AlreadyWhitelisted","type":"error"},{"inputs":[],"name":"EpochNotEnded","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"MaxEpochsReached","type":"error"},{"inputs":[],"name":"MintIsNotStarted","type":"error"},{"inputs":[],"name":"NoEnoughEth","type":"error"},{"inputs":[],"name":"NoEnoughNFT","type":"error"},{"inputs":[],"name":"NotEligible","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"StartBlockAlreadySet","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharePerMint","type":"uint256"}],"name":"EpochEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JellyBatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"JellyClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"JellyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"EPOCH_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"EpochSharePerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_QUOTA_EACH_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"epoches","type":"uint256[]"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpochEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActualCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActualCurrentEpochStartBlock","outputs":[{"internalType":"uint256","name":"actualCurrentEpochStartBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getClaimableEpoches","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpochesCollapsed","outputs":[{"internalType":"uint256","name":"epochesCollapsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTotalClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber_","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAttributes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"whitelistWithNumOfNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600c553480156200001657600080fd5b506040516200428c3803806200428c8339810160408190526200003991620001fe565b604051806040016040528060058152602001644a656c6c7960d81b815250604051806040016040528060058152602001644a454c4c5960d81b8152506012612710848060006001600160a01b0316816001600160a01b031603620000b0576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620001078682620002dd565b506002620001168582620002dd565b5060ff831660808190526200012d90600a620004be565b620001399083620004d6565b60a0525050600e80546001600160a01b0319166001600160a01b038781169182179092556000818152600b60205260408120805460ff1990811660019081179092559180527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768054909216179055908516149250620001d9915050576001600160a01b0381166000908152600b60205260409020805460ff191660011790555b5050620004f0565b80516001600160a01b0381168114620001f957600080fd5b919050565b600080604083850312156200021257600080fd5b6200021d83620001e1565b91506200022d60208401620001e1565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200026157607f821691505b6020821081036200028257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002d8576000816000526020600020601f850160051c81016020861015620002b35750805b601f850160051c820191505b81811015620002d457828155600101620002bf565b5050505b505050565b81516001600160401b03811115620002f957620002f962000236565b62000311816200030a84546200024c565b8462000288565b602080601f831160018114620003495760008415620003305750858301515b600019600386901b1c1916600185901b178555620002d4565b600085815260208120601f198616915b828110156200037a5788860151825594840194600190910190840162000359565b5085821015620003995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000400578160001904821115620003e457620003e4620003a9565b80851615620003f257918102915b93841c9390800290620003c4565b509250929050565b6000826200041957506001620004b8565b816200042857506000620004b8565b81600181146200044157600281146200044c576200046c565b6001915050620004b8565b60ff841115620004605762000460620003a9565b50506001821b620004b8565b5060208310610133831016604e8410600b841016171562000491575081810a620004b8565b6200049d8383620003bf565b8060001904821115620004b457620004b4620003a9565b0290505b92915050565b6000620004cf60ff84168362000408565b9392505050565b8082028115828204841417620004b857620004b8620003a9565b60805160a051613d6f6200051d600039600061044e01526000818161050c01526124730152613d6f6000f3fe60806040526004361061031e5760003560e01c806392fbe481116101a3578063d2ef0795116100eb578063e985e9c51161008f578063f28ca1dd1161006c578063f28ca1dd146109ed578063f2fde38b14610a02578063f35e4a6e14610a22578063f585146d14610a4257005b8063e985e9c514610970578063efe89a14146109ab578063f2824b53146109c057005b8063db0ac1ba116100c8578063db0ac1ba146108cb578063dd62ed3e146108e0578063e0df5b6f14610918578063e942bdd21461093857005b8063d2ef07951461084e578063d50c5c8914610889578063d547cfb7146108b657005b8063afab4c8711610152578063c002d23d1161012f578063c002d23d146107e0578063c516e7c3146107fb578063c87b56dd14610819578063cdc227831461083957005b8063afab4c871461077e578063b88d4fde146107ab578063bf9559c3146107cb57005b80639d7f4ebf116101805780639d7f4ebf14610711578063a22cb4651461073e578063a9059cbb1461075e57005b806392fbe481146106ac57806395d89b41146106cc5780639b19251a146106e157005b806342842e0e116102665780636352211e1161021557806376671808116101f2578063766718081461064e5780638467be0d146106645780638bbae8fe146106775780638da5cb5b1461068c57005b80636352211e146105ec57806370a082311461060c57806374c259c61461063957005b8063504334c211610243578063504334c21461058c57806353d6fd59146105ac578063605d52eb146105cc57005b806342842e0e1461054057806348cd4cb1146105605780634f02c4201461057657005b806318160ddd116102cd57806323b872dd116102aa57806323b872dd146104a55780632b968958146104c55780632f745c59146104da578063313ce567146104fa57005b806318160ddd1461043c57806318d217c3146104705780631900d4ed1461049057005b80630e313e98116102fb5780630e313e98146103d05780631249c58b14610414578063175e53bb1461041c57005b806306fdde0314610327578063081812fc14610352578063095ea7b3146103a057005b3661032557005b005b34801561033357600080fd5b5061033c610a58565b604051610349919061321d565b60405180910390f35b34801561035e57600080fd5b5061038861036d366004613250565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610349565b3480156103ac57600080fd5b506103c06103bb366004613280565b610ae6565b6040519015158152602001610349565b3480156103dc57600080fd5b506104066103eb3660046132aa565b6001600160a01b031660009081526009602052604090205490565b604051908152602001610349565b610325610c69565b34801561042857600080fd5b50610325610437366004613250565b610c7d565b34801561044857600080fd5b506104067f000000000000000000000000000000000000000000000000000000000000000081565b34801561047c57600080fd5b5061032561048b366004613381565b610c8a565b34801561049c57600080fd5b50610325610cde565b3480156104b157600080fd5b506103256104c03660046133be565b610ce7565b3480156104d157600080fd5b50610325611271565b3480156104e657600080fd5b506104066104f5366004613280565b611309565b34801561050657600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610349565b34801561054c57600080fd5b5061032561055b3660046133be565b611346565b34801561056c57600080fd5b5061040660115481565b34801561058257600080fd5b5061040660035481565b34801561059857600080fd5b506103256105a73660046133fa565b611465565b3480156105b857600080fd5b506103256105c736600461345e565b6114b3565b3480156105d857600080fd5b506104066105e73660046132aa565b611515565b3480156105f857600080fd5b50610388610607366004613250565b6115dd565b34801561061857600080fd5b506104066106273660046132aa565b60046020526000908152604090205481565b34801561064557600080fd5b5061040660c881565b34801561065a57600080fd5b50610406600c5481565b610325610672366004613250565b611631565b34801561068357600080fd5b506104066116ec565b34801561069857600080fd5b50600054610388906001600160a01b031681565b3480156106b857600080fd5b506103256106c736600461349a565b61171d565b3480156106d857600080fd5b5061033c611905565b3480156106ed57600080fd5b506103c06106fc3660046132aa565b600b6020526000908152604090205460ff1681565b34801561071d57600080fd5b5061040661072c366004613250565b60136020526000908152604090205481565b34801561074a57600080fd5b5061032561075936600461345e565b611912565b34801561076a57600080fd5b506103c0610779366004613280565b61199c565b34801561078a57600080fd5b50610406610799366004613250565b60156020526000908152604090205481565b3480156107b757600080fd5b506103256107c636600461350f565b6119b0565b3480156107d757600080fd5b50610406602881565b3480156107ec57600080fd5b50610406662386f26fc1000081565b34801561080757600080fd5b5061040669054b40b1f852bda0000081565b34801561082557600080fd5b5061033c610834366004613250565b611abd565b34801561084557600080fd5b50610406611c6a565b34801561085a57600080fd5b506103c06108693660046135aa565b601460209081526000928352604080842090915290825290205460ff1681565b34801561089557600080fd5b506108a96108a43660046132aa565b611c85565b60405161034991906135d6565b3480156108c257600080fd5b5061033c611df1565b3480156108d757600080fd5b50610406611dfe565b3480156108ec57600080fd5b506104066108fb36600461361a565b600560209081526000928352604080842090915290825290205481565b34801561092457600080fd5b50610325610933366004613381565b611e20565b34801561094457600080fd5b506104066109533660046135aa565b601260209081526000928352604080842090915290825290205481565b34801561097c57600080fd5b506103c061098b36600461361a565b600760209081526000928352604080842090915290825290205460ff1681565b3480156109b757600080fd5b50610406611e70565b3480156109cc57600080fd5b506104066109db366004613250565b60166020526000908152604090205481565b3480156109f957600080fd5b5061033c611ea8565b348015610a0e57600080fd5b50610325610a1d3660046132aa565b611eb5565b348015610a2e57600080fd5b50610325610a3d366004613250565b611f9c565b348015610a4e57600080fd5b50610406600d5481565b60018054610a6590613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9190613644565b8015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b60006003548211158015610afa5750600082115b15610c03576000828152600860205260409020546001600160a01b0316338114801590610b4b57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff16155b15610b82576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610c5f565b3360008181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610c71611ff6565b610c7b6001612081565b565b610c873382612185565b50565b6000546001600160a01b03163314610cce576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f610cda82826136e7565b5050565b610c7b3361231a565b6003548111611205576000610cfa61246c565b6000838152600860205260409020549091506001600160a01b03858116911614610d50576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610d90576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03851614801590610dcd57506001600160a01b038416600090815260076020908152604080832033845290915290205460ff16155b8015610df057506000828152600660205260409020546001600160a01b03163314155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b602052604090205460ff16610e75576001600160a01b03841660009081526004602052604081208054839290610e6f9084906137d6565b90915550505b6001600160a01b0383166000908152600b602052604090205460ff16610eb4576001600160a01b03831660009081526004602052604090208054820190555b600082815260086020908152604080832080546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600684528285208054909116905587168352600990915281208054610f21906001906137d6565b81548110610f3157610f316137e9565b60009182526020808320909101546001600160a01b0388168352600982526040808420878552600a90935290922054815492935083928110610f7557610f756137e9565b60009182526020808320909101929092556001600160a01b0387168152600990915260409020805480610faa57610faa613818565b600082815260208082208301600019908101839055909201909255848252600a8152604080832054848452818420556001600160a01b03871680845260098352908320805460018181018355828652938520018790559252905461100e91906137d6565b6000848152600a602052604080822092909255905184916001600160a01b0380881692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0385166000908152600b602052604090205460ff16801561109957506001600160a01b0384166000908152600b602052604090205460ff16155b156110e5576040518281526001600160a01b038516906000907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020015b60405180910390a36111fe565b6001600160a01b0385166000908152600b602052604090205460ff1615801561112657506001600160a01b0384166000908152600b602052604090205460ff165b15611169576040518281526000906001600160a01b038716907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020016110d8565b6001600160a01b0385166000908152600b602052604090205460ff161580156111ab57506001600160a01b0384166000908152600b602052604090205460ff16155b156111fe57836001600160a01b0316856001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487846040516111f591815260200190565b60405180910390a35b5050505050565b6001600160a01b038316600090815260056020908152604080832033845290915290205460001981146112615761123c82826137d6565b6001600160a01b03851660009081526005602090815260408083203384529091529020555b6111fe8484846124a4565b505050565b6000546001600160a01b031633146112b5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6001600160a01b0382166000908152600960205260408120805483908110611333576113336137e9565b9060005260206000200154905092915050565b611351838383610ce7565b6001600160a01b0382163b1580159061142e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b1561126c576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031633146114a9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cda828261266d565b6000546001600160a01b031633146114f7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560010361150c57610cda826000612185565b610cda8261231a565b600080806115216116ec565b905060005b818110156115d45760008181526014602090815260408083206001600160a01b038916845290915290205460ff16158015611582575060008181526012602090815260408083206001600160a01b038916845290915290205415155b156115cc57600081815260156020908152604080832054601283528184206001600160a01b038a1685529092528220546115bc9190613889565b90506115c881856138a0565b9350505b600101611526565b50909392505050565b6000818152600860205260409020546001600160a01b03168061162c576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081116116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064015b60405180910390fd5b6116a8611ff6565b6116b181612081565b600c5460405182815233907f5b136fb1e698389fd0ad0ee2ebe50a59bd7787f2b10321419ed20df0f9214a169060200160405180910390a350565b6000806116f7611e70565b600c5461170491906138a0565b905060288110611715576028611717565b805b91505090565b611725612686565b6000806117306116ec565b905060005b838110156118f8576000858583818110611751576117516137e9565b905060200201359050828110611793576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260146020908152604080832033845290915290205460ff16156117e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320338452909152902054156118bd57600081815260156020908152604080832054601283528184203385529092528220546118329190613889565b905061183e81866138a0565b6000838152601460209081526040808320338085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184815292975084927fe552a294d5b69fa9228dede48623b191598f8d38db6f7e5d7a8a8ba5c3ff769b910160405180910390a3506118ef565b6040517ff8eb54de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611735565b506111fe600033846124a4565b60028054610a6590613644565b3360008181526007602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006119a93384846124a4565b9392505050565b6119bb858585610ce7565b6001600160a01b0384163b15801590611a8657506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290611a1e9033908a908990899089906004016138b3565b6020604051808303816000875af1158015611a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a619190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156111fe576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600060108054611ace90613644565b90501115611b08576010611ae183612761565b604051602001611af2929190613998565b6040516020818303038152906040529050919050565b60008281526016602052604081205490611b2182612801565b90506000611b2e85612761565b604051602001611b3e91906139bd565b60408051601f1981840301815290829052611b5b91602001613a02565b604051602081830303815290604052600f83604051602001611b7e929190613adb565b60408051601f1981840301815290829052611b9c9291602001613b28565b6040516020818303038152906040529050600082604051602001611bc09190613b4e565b60408051601f198184030181528282018252600483527f227d5d7d000000000000000000000000000000000000000000000000000000006020848101919091529151909350611c13918591859101613b28565b60408051601f1981840301815290829052611c32918390602001613b28565b60408051601f1981840301815290829052611c4f91602001613bb9565b60405160208183030381529060405295505050505050919050565b600060c8611c76611dfe565b611c8091906138a0565b905090565b60606000805b600c54811015611d045760008181526014602090815260408083206001600160a01b038816845290915290205460ff16158015611ce9575060008181526012602090815260408083206001600160a01b038816845290915290205415155b15611cfc5781611cf881613bfe565b9250505b600101611c8b565b5060008167ffffffffffffffff811115611d2057611d206132c5565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b5090506000805b600c54811015611de75760008181526014602090815260408083206001600160a01b038a16845290915290205460ff16158015611dae575060008181526012602090815260408083206001600160a01b038a16845290915290205415155b15611ddf5780838381518110611dc657611dc66137e9565b602090810291909101015281611ddb81613bfe565b9250505b600101611d50565b5090949350505050565b60108054610a6590613644565b6000611e086116ec565b611e139060c8613889565b601154611c8091906138a0565b6000546001600160a01b03163314611e64576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010610cda82826136e7565b6000600d544310611ea257600c5460c860115443611e8e91906137d6565b611e989190613c47565b611c8091906137d6565b50600090565b600f8054610a6590613644565b6000546001600160a01b03163314611ef9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f39576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b03163314611fe0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011819055611ff060c8826138a0565b600d5550565b6011544310806120065750601154155b1561203d576040517f4ef7443900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612045612686565b6028600c5403610c7b576040517fb85d46bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061209482662386f26fc10000613889565b9050803410156120d0576040517f80b6e14b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120dc82346137d6565b600c8054600090815260126020908152604080832033845282528083208054890190559254825260139052208054850190559050801561214557604051339082156108fc029083906000818181858888f19350505050158015612143573d6000803e3d6000fd5b505b600e546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561217f573d6000803e3d6000fd5b50505050565b6001600160a01b0382166000908152600b602052604090205460ff16156121d8576040517fb73e95e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600960205260409020548082111561222b576040517fd220db2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561227461246c565b61227e9084613889565b905060005b61228d84846137d6565b8110156122a55761229d85612d88565b600101612283565b506001600160a01b038416600090815260046020526040812080548392906122ce9084906137d6565b90915550506040518181526000906001600160a01b038616907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314879060200160405180910390a350505050565b6001600160a01b0381166000908152600b602052604090205460ff1661236c576040517fd35cb30a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061237661246c565b6001600160a01b0383166000908152600960205260409020546123999190613889565b905060006123a561246c565b6001600160a01b0384166000908152600460205260409020546123c89190613c47565b905060005b818110156123e6576123de84612ee1565b6001016123cd565b506123f3600033846124a4565b506001600160a01b0383166000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055518481523392917fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487910160405180910390a3505050565b60006124997f0000000000000000000000000000000000000000000000000000000000000000600a613d3f565b611c809060c8613889565b6000806124af61246c565b6001600160a01b038087166000818152600460205260408082205493891682529020549293509091901561250b576001600160a01b038716600090815260046020526040812080548792906125059084906137d6565b90915550505b6001600160a01b03808716600090815260046020908152604080832080548a019055928a168252600b9052205460ff16612598576001600160a01b038716600090815260046020526040812054612563908590613c47565b61256d8585613c47565b61257791906137d6565b905060005b818110156125955761258d89612d88565b60010161257c565b50505b6001600160a01b0386166000908152600b602052604090205460ff166126135760006125c48483613c47565b6001600160a01b0388166000908152600460205260409020546125e8908690613c47565b6125f291906137d6565b905060005b818110156126105761260888612ee1565b6001016125f7565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161265891815260200190565b60405180910390a35060019695505050505050565b600161267983826136e7565b50600261126c82826136e7565b600d5443101561269257565b600061269f600c546130b4565b600c8054600090815260156020908152604080832085905592548083526013825291839020548351908152908101849052929350917f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2910160405180910390a26127076116ec565b600c8190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8016127355750565b60c861273f6116ec565b61274a9060016138a0565b6127549190613889565b601154611ff091906138a0565b6060600061276e836130f3565b600101905060008167ffffffffffffffff81111561278e5761278e6132c5565b6040519080825280601f01601f1916602001820160405280156127b8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846127c257509392505050565b606060008260405160200161281891815260200190565b60408051601f198184030181529190528051602082012090915080600061284161010083613d4e565b6040805160098082526101408201909252919250600091906020820161012080368337505060408051600980825261014082019092529293506000929150602082015b60608152602001906001900390816128845790505090506032826000815181106128b0576128b06137e9565b6020026020010181815250506040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081600081518110612905576129056137e9565b6020026020010181905250602882600181518110612925576129256137e9565b6020026020010181815250506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152508160018151811061297a5761297a6137e9565b602002602001018190525060238260028151811061299a5761299a6137e9565b6020026020010181815250506040518060400160405280600381526020017f5265640000000000000000000000000000000000000000000000000000000000815250816002815181106129ef576129ef6137e9565b6020026020010181905250601f82600381518110612a0f57612a0f6137e9565b6020026020010181815250506040518060400160405280600481526020017f50696e6b0000000000000000000000000000000000000000000000000000000081525081600381518110612a6457612a646137e9565b6020026020010181905250601e82600481518110612a8457612a846137e9565b6020026020010181815250506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081600481518110612ad957612ad96137e9565b6020026020010181905250601982600581518110612af957612af96137e9565b6020026020010181815250506040518060400160405280600481526020017f5465616c0000000000000000000000000000000000000000000000000000000081525081600581518110612b4e57612b4e6137e9565b6020026020010181905250601482600681518110612b6e57612b6e6137e9565b6020026020010181815250506040518060400160405280600681526020017f507572706c65000000000000000000000000000000000000000000000000000081525081600681518110612bc357612bc36137e9565b6020026020010181905250600f82600781518110612be357612be36137e9565b6020026020010181815250506040518060400160405280600881526020017f4c6176656e64657200000000000000000000000000000000000000000000000081525081600781518110612c3857612c386137e9565b6020026020010181905250600a82600881518110612c5857612c586137e9565b6020026020010181815250506040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081600881518110612cad57612cad6137e9565b60200260200101819052506000805b8351811015612d2557838181518110612cd757612cd76137e9565b602002602001015182612cea91906138a0565b915081851015612d1d57828181518110612d0657612d066137e9565b602002602001015198505050505050505050919050565b600101612cbc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c69642072616e646f6d206e756d6265722070726f76696465642e006044820152606401611697565b6001600160a01b038116612dc8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054612dee906001906137d6565b81548110612dfe57612dfe6137e9565b9060005260206000200154905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020805480612e3f57612e3f613818565b600082815260208082208301600019908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116612f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964526563697069656e74000000000000000000000000000000006044820152606401611697565b60038054600101908190556000818152600860205260409020546001600160a01b031615612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c7265616479457869737473000000000000000000000000000000000000006044820152606401611697565b600081815260086020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461304b91906137d6565b6000828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061309d826131d5565b600092835260166020526040909220919091555050565b600081815260136020526040812054156130eb576000828152601360205260408120546119a99069054b40b1f852bda00000613c47565b506000919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061313c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613168576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061318657662386f26fc10000830492506010015b6305f5e100831061319e576305f5e100830492506008015b61271083106131b257612710830492506004015b606483106131c4576064830492506002015b600a8310610c635760010192915050565b600081426131e46001436137d6565b6131ef9190406138a0565b610c6391906138a0565b60005b838110156132145781810151838201526020016131fc565b50506000910152565b602081526000825180602084015261323c8160408501602087016131f9565b601f01601f19169190910160400192915050565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461162c57600080fd5b6000806040838503121561329357600080fd5b61329c83613269565b946020939093013593505050565b6000602082840312156132bc57600080fd5b6119a982613269565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261330557600080fd5b813567ffffffffffffffff80821115613320576133206132c5565b604051601f8301601f19908116603f01168101908282118183101715613348576133486132c5565b8160405283815286602085880101111561336157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561339357600080fd5b813567ffffffffffffffff8111156133aa57600080fd5b6133b6848285016132f4565b949350505050565b6000806000606084860312156133d357600080fd5b6133dc84613269565b92506133ea60208501613269565b9150604084013590509250925092565b6000806040838503121561340d57600080fd5b823567ffffffffffffffff8082111561342557600080fd5b613431868387016132f4565b9350602085013591508082111561344757600080fd5b50613454858286016132f4565b9150509250929050565b6000806040838503121561347157600080fd5b61347a83613269565b91506020830135801515811461348f57600080fd5b809150509250929050565b600080602083850312156134ad57600080fd5b823567ffffffffffffffff808211156134c557600080fd5b818501915085601f8301126134d957600080fd5b8135818111156134e857600080fd5b8660208260051b85010111156134fd57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561352757600080fd5b61353086613269565b945061353e60208701613269565b935060408601359250606086013567ffffffffffffffff8082111561356257600080fd5b818801915088601f83011261357657600080fd5b81358181111561358557600080fd5b89602082850101111561359757600080fd5b9699959850939650602001949392505050565b600080604083850312156135bd57600080fd5b823591506135cd60208401613269565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561360e578351835292840192918401916001016135f2565b50909695505050505050565b6000806040838503121561362d57600080fd5b61363683613269565b91506135cd60208401613269565b600181811c9082168061365857607f821691505b602082108103613691577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561126c576000816000526020600020601f850160051c810160208610156136c05750805b601f850160051c820191505b818110156136df578281556001016136cc565b505050505050565b815167ffffffffffffffff811115613701576137016132c5565b6137158161370f8454613644565b84613697565b602080601f83116001811461374a57600084156137325750858301515b600019600386901b1c1916600185901b1785556136df565b600085815260208120601f198616915b828110156137795788860151825594840194600190910190840161375a565b50858210156137975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c6357610c636137a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561385957600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146119a957600080fd5b8082028115828204841417610c6357610c636137a7565b80820180821115610c6357610c636137a7565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461391481613644565b6001828116801561392c576001811461395f5761398e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061398e565b8560005260208060002060005b858110156139855781548a82015290840190820161396c565b50505082870194505b5050505092915050565b60006139a48285613907565b83516139b48183602088016131f9565b01949350505050565b7f7b226e616d65223a20224a656c6c7920230000000000000000000000000000008152600082516139f58160118501602087016131f9565b9190910160110192915050565b60008251613a148184602087016131f9565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f669201918252507f2031302c303030205265706c6963616e747320656e61626c656420627920455260208201527f43373631362c20616e206578706572696d656e74616c20746f6b656e2073746160408201527f6e646172642e222c2265787465726e616c5f75726c223a2268747470733a2f2f60608201527f6a656c6c792e746f70222c22696d616765223a220000000000000000000000006080820152609401919050565b6000613ae78285613907565b8351613af78183602088016131f9565b7f2e6a7067000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b60008351613b3a8184602088016131f9565b8351908301906139b48183602088016131f9565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224381527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015260008251613bac81602f8501602087016131f9565b91909101602f0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815260008251613bf181601b8501602087016131f9565b91909101601b0192915050565b60006000198203613c1157613c116137a7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613c5657613c56613c18565b500490565b600181815b80851115613c96578160001904821115613c7c57613c7c6137a7565b80851615613c8957918102915b93841c9390800290613c60565b509250929050565b600082613cad57506001610c63565b81613cba57506000610c63565b8160018114613cd05760028114613cda57613cf6565b6001915050610c63565b60ff841115613ceb57613ceb6137a7565b50506001821b610c63565b5060208310610133831016604e8410600b8410161715613d19575081810a610c63565b613d238383613c5b565b8060001904821115613d3757613d376137a7565b029392505050565b60006119a960ff841683613c9e565b600082613d5d57613d5d613c18565b50069056fea164736f6c6343000817000a00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032

Deployed Bytecode

0x60806040526004361061031e5760003560e01c806392fbe481116101a3578063d2ef0795116100eb578063e985e9c51161008f578063f28ca1dd1161006c578063f28ca1dd146109ed578063f2fde38b14610a02578063f35e4a6e14610a22578063f585146d14610a4257005b8063e985e9c514610970578063efe89a14146109ab578063f2824b53146109c057005b8063db0ac1ba116100c8578063db0ac1ba146108cb578063dd62ed3e146108e0578063e0df5b6f14610918578063e942bdd21461093857005b8063d2ef07951461084e578063d50c5c8914610889578063d547cfb7146108b657005b8063afab4c8711610152578063c002d23d1161012f578063c002d23d146107e0578063c516e7c3146107fb578063c87b56dd14610819578063cdc227831461083957005b8063afab4c871461077e578063b88d4fde146107ab578063bf9559c3146107cb57005b80639d7f4ebf116101805780639d7f4ebf14610711578063a22cb4651461073e578063a9059cbb1461075e57005b806392fbe481146106ac57806395d89b41146106cc5780639b19251a146106e157005b806342842e0e116102665780636352211e1161021557806376671808116101f2578063766718081461064e5780638467be0d146106645780638bbae8fe146106775780638da5cb5b1461068c57005b80636352211e146105ec57806370a082311461060c57806374c259c61461063957005b8063504334c211610243578063504334c21461058c57806353d6fd59146105ac578063605d52eb146105cc57005b806342842e0e1461054057806348cd4cb1146105605780634f02c4201461057657005b806318160ddd116102cd57806323b872dd116102aa57806323b872dd146104a55780632b968958146104c55780632f745c59146104da578063313ce567146104fa57005b806318160ddd1461043c57806318d217c3146104705780631900d4ed1461049057005b80630e313e98116102fb5780630e313e98146103d05780631249c58b14610414578063175e53bb1461041c57005b806306fdde0314610327578063081812fc14610352578063095ea7b3146103a057005b3661032557005b005b34801561033357600080fd5b5061033c610a58565b604051610349919061321d565b60405180910390f35b34801561035e57600080fd5b5061038861036d366004613250565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610349565b3480156103ac57600080fd5b506103c06103bb366004613280565b610ae6565b6040519015158152602001610349565b3480156103dc57600080fd5b506104066103eb3660046132aa565b6001600160a01b031660009081526009602052604090205490565b604051908152602001610349565b610325610c69565b34801561042857600080fd5b50610325610437366004613250565b610c7d565b34801561044857600080fd5b506104067f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b34801561047c57600080fd5b5061032561048b366004613381565b610c8a565b34801561049c57600080fd5b50610325610cde565b3480156104b157600080fd5b506103256104c03660046133be565b610ce7565b3480156104d157600080fd5b50610325611271565b3480156104e657600080fd5b506104066104f5366004613280565b611309565b34801561050657600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610349565b34801561054c57600080fd5b5061032561055b3660046133be565b611346565b34801561056c57600080fd5b5061040660115481565b34801561058257600080fd5b5061040660035481565b34801561059857600080fd5b506103256105a73660046133fa565b611465565b3480156105b857600080fd5b506103256105c736600461345e565b6114b3565b3480156105d857600080fd5b506104066105e73660046132aa565b611515565b3480156105f857600080fd5b50610388610607366004613250565b6115dd565b34801561061857600080fd5b506104066106273660046132aa565b60046020526000908152604090205481565b34801561064557600080fd5b5061040660c881565b34801561065a57600080fd5b50610406600c5481565b610325610672366004613250565b611631565b34801561068357600080fd5b506104066116ec565b34801561069857600080fd5b50600054610388906001600160a01b031681565b3480156106b857600080fd5b506103256106c736600461349a565b61171d565b3480156106d857600080fd5b5061033c611905565b3480156106ed57600080fd5b506103c06106fc3660046132aa565b600b6020526000908152604090205460ff1681565b34801561071d57600080fd5b5061040661072c366004613250565b60136020526000908152604090205481565b34801561074a57600080fd5b5061032561075936600461345e565b611912565b34801561076a57600080fd5b506103c0610779366004613280565b61199c565b34801561078a57600080fd5b50610406610799366004613250565b60156020526000908152604090205481565b3480156107b757600080fd5b506103256107c636600461350f565b6119b0565b3480156107d757600080fd5b50610406602881565b3480156107ec57600080fd5b50610406662386f26fc1000081565b34801561080757600080fd5b5061040669054b40b1f852bda0000081565b34801561082557600080fd5b5061033c610834366004613250565b611abd565b34801561084557600080fd5b50610406611c6a565b34801561085a57600080fd5b506103c06108693660046135aa565b601460209081526000928352604080842090915290825290205460ff1681565b34801561089557600080fd5b506108a96108a43660046132aa565b611c85565b60405161034991906135d6565b3480156108c257600080fd5b5061033c611df1565b3480156108d757600080fd5b50610406611dfe565b3480156108ec57600080fd5b506104066108fb36600461361a565b600560209081526000928352604080842090915290825290205481565b34801561092457600080fd5b50610325610933366004613381565b611e20565b34801561094457600080fd5b506104066109533660046135aa565b601260209081526000928352604080842090915290825290205481565b34801561097c57600080fd5b506103c061098b36600461361a565b600760209081526000928352604080842090915290825290205460ff1681565b3480156109b757600080fd5b50610406611e70565b3480156109cc57600080fd5b506104066109db366004613250565b60166020526000908152604090205481565b3480156109f957600080fd5b5061033c611ea8565b348015610a0e57600080fd5b50610325610a1d3660046132aa565b611eb5565b348015610a2e57600080fd5b50610325610a3d366004613250565b611f9c565b348015610a4e57600080fd5b50610406600d5481565b60018054610a6590613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9190613644565b8015610ade5780601f10610ab357610100808354040283529160200191610ade565b820191906000526020600020905b815481529060010190602001808311610ac157829003601f168201915b505050505081565b60006003548211158015610afa5750600082115b15610c03576000828152600860205260409020546001600160a01b0316338114801590610b4b57506001600160a01b038116600090815260076020908152604080832033845290915290205460ff16155b15610b82576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610c5f565b3360008181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b610c71611ff6565b610c7b6001612081565b565b610c873382612185565b50565b6000546001600160a01b03163314610cce576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f610cda82826136e7565b5050565b610c7b3361231a565b6003548111611205576000610cfa61246c565b6000838152600860205260409020549091506001600160a01b03858116911614610d50576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610d90576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03851614801590610dcd57506001600160a01b038416600090815260076020908152604080832033845290915290205460ff16155b8015610df057506000828152600660205260409020546001600160a01b03163314155b15610e27576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600b602052604090205460ff16610e75576001600160a01b03841660009081526004602052604081208054839290610e6f9084906137d6565b90915550505b6001600160a01b0383166000908152600b602052604090205460ff16610eb4576001600160a01b03831660009081526004602052604090208054820190555b600082815260086020908152604080832080546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600684528285208054909116905587168352600990915281208054610f21906001906137d6565b81548110610f3157610f316137e9565b60009182526020808320909101546001600160a01b0388168352600982526040808420878552600a90935290922054815492935083928110610f7557610f756137e9565b60009182526020808320909101929092556001600160a01b0387168152600990915260409020805480610faa57610faa613818565b600082815260208082208301600019908101839055909201909255848252600a8152604080832054848452818420556001600160a01b03871680845260098352908320805460018181018355828652938520018790559252905461100e91906137d6565b6000848152600a602052604080822092909255905184916001600160a01b0380881692908916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46001600160a01b0385166000908152600b602052604090205460ff16801561109957506001600160a01b0384166000908152600b602052604090205460ff16155b156110e5576040518281526001600160a01b038516906000907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020015b60405180910390a36111fe565b6001600160a01b0385166000908152600b602052604090205460ff1615801561112657506001600160a01b0384166000908152600b602052604090205460ff165b15611169576040518281526000906001600160a01b038716907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487906020016110d8565b6001600160a01b0385166000908152600b602052604090205460ff161580156111ab57506001600160a01b0384166000908152600b602052604090205460ff16155b156111fe57836001600160a01b0316856001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487846040516111f591815260200190565b60405180910390a35b5050505050565b6001600160a01b038316600090815260056020908152604080832033845290915290205460001981146112615761123c82826137d6565b6001600160a01b03851660009081526005602090815260408083203384529091529020555b6111fe8484846124a4565b505050565b6000546001600160a01b031633146112b5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6001600160a01b0382166000908152600960205260408120805483908110611333576113336137e9565b9060005260206000200154905092915050565b611351838383610ce7565b6001600160a01b0382163b1580159061142e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b1561126c576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b031633146114a9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cda828261266d565b6000546001600160a01b031633146114f7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560010361150c57610cda826000612185565b610cda8261231a565b600080806115216116ec565b905060005b818110156115d45760008181526014602090815260408083206001600160a01b038916845290915290205460ff16158015611582575060008181526012602090815260408083206001600160a01b038916845290915290205415155b156115cc57600081815260156020908152604080832054601283528184206001600160a01b038a1685529092528220546115bc9190613889565b90506115c881856138a0565b9350505b600101611526565b50909392505050565b6000818152600860205260409020546001600160a01b03168061162c576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600081116116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064015b60405180910390fd5b6116a8611ff6565b6116b181612081565b600c5460405182815233907f5b136fb1e698389fd0ad0ee2ebe50a59bd7787f2b10321419ed20df0f9214a169060200160405180910390a350565b6000806116f7611e70565b600c5461170491906138a0565b905060288110611715576028611717565b805b91505090565b611725612686565b6000806117306116ec565b905060005b838110156118f8576000858583818110611751576117516137e9565b905060200201359050828110611793576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260146020908152604080832033845290915290205460ff16156117e7576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320338452909152902054156118bd57600081815260156020908152604080832054601283528184203385529092528220546118329190613889565b905061183e81866138a0565b6000838152601460209081526040808320338085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184815292975084927fe552a294d5b69fa9228dede48623b191598f8d38db6f7e5d7a8a8ba5c3ff769b910160405180910390a3506118ef565b6040517ff8eb54de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611735565b506111fe600033846124a4565b60028054610a6590613644565b3360008181526007602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006119a93384846124a4565b9392505050565b6119bb858585610ce7565b6001600160a01b0384163b15801590611a8657506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a0290611a1e9033908a908990899089906004016138b3565b6020604051808303816000875af1158015611a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a619190613847565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156111fe576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060600060108054611ace90613644565b90501115611b08576010611ae183612761565b604051602001611af2929190613998565b6040516020818303038152906040529050919050565b60008281526016602052604081205490611b2182612801565b90506000611b2e85612761565b604051602001611b3e91906139bd565b60408051601f1981840301815290829052611b5b91602001613a02565b604051602081830303815290604052600f83604051602001611b7e929190613adb565b60408051601f1981840301815290829052611b9c9291602001613b28565b6040516020818303038152906040529050600082604051602001611bc09190613b4e565b60408051601f198184030181528282018252600483527f227d5d7d000000000000000000000000000000000000000000000000000000006020848101919091529151909350611c13918591859101613b28565b60408051601f1981840301815290829052611c32918390602001613b28565b60408051601f1981840301815290829052611c4f91602001613bb9565b60405160208183030381529060405295505050505050919050565b600060c8611c76611dfe565b611c8091906138a0565b905090565b60606000805b600c54811015611d045760008181526014602090815260408083206001600160a01b038816845290915290205460ff16158015611ce9575060008181526012602090815260408083206001600160a01b038816845290915290205415155b15611cfc5781611cf881613bfe565b9250505b600101611c8b565b5060008167ffffffffffffffff811115611d2057611d206132c5565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b5090506000805b600c54811015611de75760008181526014602090815260408083206001600160a01b038a16845290915290205460ff16158015611dae575060008181526012602090815260408083206001600160a01b038a16845290915290205415155b15611ddf5780838381518110611dc657611dc66137e9565b602090810291909101015281611ddb81613bfe565b9250505b600101611d50565b5090949350505050565b60108054610a6590613644565b6000611e086116ec565b611e139060c8613889565b601154611c8091906138a0565b6000546001600160a01b03163314611e64576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010610cda82826136e7565b6000600d544310611ea257600c5460c860115443611e8e91906137d6565b611e989190613c47565b611c8091906137d6565b50600090565b600f8054610a6590613644565b6000546001600160a01b03163314611ef9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f39576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000546001600160a01b03163314611fe0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011819055611ff060c8826138a0565b600d5550565b6011544310806120065750601154155b1561203d576040517f4ef7443900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612045612686565b6028600c5403610c7b576040517fb85d46bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061209482662386f26fc10000613889565b9050803410156120d0576040517f80b6e14b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120dc82346137d6565b600c8054600090815260126020908152604080832033845282528083208054890190559254825260139052208054850190559050801561214557604051339082156108fc029083906000818181858888f19350505050158015612143573d6000803e3d6000fd5b505b600e546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561217f573d6000803e3d6000fd5b50505050565b6001600160a01b0382166000908152600b602052604090205460ff16156121d8576040517fb73e95e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600960205260409020548082111561222b576040517fd220db2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152600b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561227461246c565b61227e9084613889565b905060005b61228d84846137d6565b8110156122a55761229d85612d88565b600101612283565b506001600160a01b038416600090815260046020526040812080548392906122ce9084906137d6565b90915550506040518181526000906001600160a01b038616907fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314879060200160405180910390a350505050565b6001600160a01b0381166000908152600b602052604090205460ff1661236c576040517fd35cb30a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061237661246c565b6001600160a01b0383166000908152600960205260409020546123999190613889565b905060006123a561246c565b6001600160a01b0384166000908152600460205260409020546123c89190613c47565b905060005b818110156123e6576123de84612ee1565b6001016123cd565b506123f3600033846124a4565b506001600160a01b0383166000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055518481523392917fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487910160405180910390a3505050565b60006124997f0000000000000000000000000000000000000000000000000000000000000012600a613d3f565b611c809060c8613889565b6000806124af61246c565b6001600160a01b038087166000818152600460205260408082205493891682529020549293509091901561250b576001600160a01b038716600090815260046020526040812080548792906125059084906137d6565b90915550505b6001600160a01b03808716600090815260046020908152604080832080548a019055928a168252600b9052205460ff16612598576001600160a01b038716600090815260046020526040812054612563908590613c47565b61256d8585613c47565b61257791906137d6565b905060005b818110156125955761258d89612d88565b60010161257c565b50505b6001600160a01b0386166000908152600b602052604090205460ff166126135760006125c48483613c47565b6001600160a01b0388166000908152600460205260409020546125e8908690613c47565b6125f291906137d6565b905060005b818110156126105761260888612ee1565b6001016125f7565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161265891815260200190565b60405180910390a35060019695505050505050565b600161267983826136e7565b50600261126c82826136e7565b600d5443101561269257565b600061269f600c546130b4565b600c8054600090815260156020908152604080832085905592548083526013825291839020548351908152908101849052929350917f469dcd0c8170c8faf3678737ed5cc64107d6d30846f97438a0feefacbed00ec2910160405180910390a26127076116ec565b600c8190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8016127355750565b60c861273f6116ec565b61274a9060016138a0565b6127549190613889565b601154611ff091906138a0565b6060600061276e836130f3565b600101905060008167ffffffffffffffff81111561278e5761278e6132c5565b6040519080825280601f01601f1916602001820160405280156127b8576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846127c257509392505050565b606060008260405160200161281891815260200190565b60408051601f198184030181529190528051602082012090915080600061284161010083613d4e565b6040805160098082526101408201909252919250600091906020820161012080368337505060408051600980825261014082019092529293506000929150602082015b60608152602001906001900390816128845790505090506032826000815181106128b0576128b06137e9565b6020026020010181815250506040518060400160405280600581526020017f477265656e00000000000000000000000000000000000000000000000000000081525081600081518110612905576129056137e9565b6020026020010181905250602882600181518110612925576129256137e9565b6020026020010181815250506040518060400160405280600681526020017f4f72616e676500000000000000000000000000000000000000000000000000008152508160018151811061297a5761297a6137e9565b602002602001018190525060238260028151811061299a5761299a6137e9565b6020026020010181815250506040518060400160405280600381526020017f5265640000000000000000000000000000000000000000000000000000000000815250816002815181106129ef576129ef6137e9565b6020026020010181905250601f82600381518110612a0f57612a0f6137e9565b6020026020010181815250506040518060400160405280600481526020017f50696e6b0000000000000000000000000000000000000000000000000000000081525081600381518110612a6457612a646137e9565b6020026020010181905250601e82600481518110612a8457612a846137e9565b6020026020010181815250506040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081600481518110612ad957612ad96137e9565b6020026020010181905250601982600581518110612af957612af96137e9565b6020026020010181815250506040518060400160405280600481526020017f5465616c0000000000000000000000000000000000000000000000000000000081525081600581518110612b4e57612b4e6137e9565b6020026020010181905250601482600681518110612b6e57612b6e6137e9565b6020026020010181815250506040518060400160405280600681526020017f507572706c65000000000000000000000000000000000000000000000000000081525081600681518110612bc357612bc36137e9565b6020026020010181905250600f82600781518110612be357612be36137e9565b6020026020010181815250506040518060400160405280600881526020017f4c6176656e64657200000000000000000000000000000000000000000000000081525081600781518110612c3857612c386137e9565b6020026020010181905250600a82600881518110612c5857612c586137e9565b6020026020010181815250506040518060400160405280600481526020017f476f6c640000000000000000000000000000000000000000000000000000000081525081600881518110612cad57612cad6137e9565b60200260200101819052506000805b8351811015612d2557838181518110612cd757612cd76137e9565b602002602001015182612cea91906138a0565b915081851015612d1d57828181518110612d0657612d066137e9565b602002602001015198505050505050505050919050565b600101612cbc565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c69642072616e646f6d206e756d6265722070726f76696465642e006044820152606401611697565b6001600160a01b038116612dc8576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054612dee906001906137d6565b81548110612dfe57612dfe6137e9565b9060005260206000200154905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020805480612e3f57612e3f613818565b600082815260208082208301600019908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038116612f51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964526563697069656e74000000000000000000000000000000006044820152606401611697565b60038054600101908190556000818152600860205260409020546001600160a01b031615612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f416c7265616479457869737473000000000000000000000000000000000000006044820152606401611697565b600081815260086020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461304b91906137d6565b6000828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061309d826131d5565b600092835260166020526040909220919091555050565b600081815260136020526040812054156130eb576000828152601360205260408120546119a99069054b40b1f852bda00000613c47565b506000919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061313c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310613168576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061318657662386f26fc10000830492506010015b6305f5e100831061319e576305f5e100830492506008015b61271083106131b257612710830492506004015b606483106131c4576064830492506002015b600a8310610c635760010192915050565b600081426131e46001436137d6565b6131ef9190406138a0565b610c6391906138a0565b60005b838110156132145781810151838201526020016131fc565b50506000910152565b602081526000825180602084015261323c8160408501602087016131f9565b601f01601f19169190910160400192915050565b60006020828403121561326257600080fd5b5035919050565b80356001600160a01b038116811461162c57600080fd5b6000806040838503121561329357600080fd5b61329c83613269565b946020939093013593505050565b6000602082840312156132bc57600080fd5b6119a982613269565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261330557600080fd5b813567ffffffffffffffff80821115613320576133206132c5565b604051601f8301601f19908116603f01168101908282118183101715613348576133486132c5565b8160405283815286602085880101111561336157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561339357600080fd5b813567ffffffffffffffff8111156133aa57600080fd5b6133b6848285016132f4565b949350505050565b6000806000606084860312156133d357600080fd5b6133dc84613269565b92506133ea60208501613269565b9150604084013590509250925092565b6000806040838503121561340d57600080fd5b823567ffffffffffffffff8082111561342557600080fd5b613431868387016132f4565b9350602085013591508082111561344757600080fd5b50613454858286016132f4565b9150509250929050565b6000806040838503121561347157600080fd5b61347a83613269565b91506020830135801515811461348f57600080fd5b809150509250929050565b600080602083850312156134ad57600080fd5b823567ffffffffffffffff808211156134c557600080fd5b818501915085601f8301126134d957600080fd5b8135818111156134e857600080fd5b8660208260051b85010111156134fd57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561352757600080fd5b61353086613269565b945061353e60208701613269565b935060408601359250606086013567ffffffffffffffff8082111561356257600080fd5b818801915088601f83011261357657600080fd5b81358181111561358557600080fd5b89602082850101111561359757600080fd5b9699959850939650602001949392505050565b600080604083850312156135bd57600080fd5b823591506135cd60208401613269565b90509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561360e578351835292840192918401916001016135f2565b50909695505050505050565b6000806040838503121561362d57600080fd5b61363683613269565b91506135cd60208401613269565b600181811c9082168061365857607f821691505b602082108103613691577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561126c576000816000526020600020601f850160051c810160208610156136c05750805b601f850160051c820191505b818110156136df578281556001016136cc565b505050505050565b815167ffffffffffffffff811115613701576137016132c5565b6137158161370f8454613644565b84613697565b602080601f83116001811461374a57600084156137325750858301515b600019600386901b1c1916600185901b1785556136df565b600085815260208120601f198616915b828110156137795788860151825594840194600190910190840161375a565b50858210156137975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c6357610c636137a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561385957600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146119a957600080fd5b8082028115828204841417610c6357610c636137a7565b80820180821115610c6357610c636137a7565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461391481613644565b6001828116801561392c576001811461395f5761398e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061398e565b8560005260208060002060005b858110156139855781548a82015290840190820161396c565b50505082870194505b5050505092915050565b60006139a48285613907565b83516139b48183602088016131f9565b01949350505050565b7f7b226e616d65223a20224a656c6c7920230000000000000000000000000000008152600082516139f58160118501602087016131f9565b9190910160110192915050565b60008251613a148184602087016131f9565b7f222c226465736372697074696f6e223a224120636f6c6c656374696f6e206f669201918252507f2031302c303030205265706c6963616e747320656e61626c656420627920455260208201527f43373631362c20616e206578706572696d656e74616c20746f6b656e2073746160408201527f6e646172642e222c2265787465726e616c5f75726c223a2268747470733a2f2f60608201527f6a656c6c792e746f70222c22696d616765223a220000000000000000000000006080820152609401919050565b6000613ae78285613907565b8351613af78183602088016131f9565b7f2e6a7067000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b60008351613b3a8184602088016131f9565b8351908301906139b48183602088016131f9565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a224381527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015260008251613bac81602f8501602087016131f9565b91909101602f0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815260008251613bf181601b8501602087016131f9565b91909101601b0192915050565b60006000198203613c1157613c116137a7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613c5657613c56613c18565b500490565b600181815b80851115613c96578160001904821115613c7c57613c7c6137a7565b80851615613c8957918102915b93841c9390800290613c60565b509250929050565b600082613cad57506001610c63565b81613cba57506000610c63565b8160018114613cd05760028114613cda57613cf6565b6001915050610c63565b60ff841115613ceb57613ceb6137a7565b50506001821b610c63565b5060208310610133831016604e8410600b8410161715613d19575081810a610c63565b613d238383613c5b565b8060001904821115613d3757613d376137a7565b029392505050565b60006119a960ff841683613c9e565b600082613d5d57613d5d613c18565b50069056fea164736f6c6343000817000a

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

00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032

-----Decoded View---------------
Arg [0] : teamAddress_ (address): 0x84c1c60d2E973EF87B1Fd175bB9BF1E4e6B8cbC7
Arg [1] : _owner (address): 0xcFC947Ff43c8d9c57a82D806Ca1D41d8cb999032

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000084c1c60d2e973ef87b1fd175bb9bf1e4e6b8cbc7
Arg [1] : 000000000000000000000000cfc947ff43c8d9c57a82d806ca1d41d8cb999032


Loading...
Loading
Loading...
Loading
[ 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.