ETH Price: $2,422.64 (-2.72%)

Token

First Edition Wrasslers (FEWRASS)
 

Overview

Max Total Supply

2,100 FEWRASS

Holders

55

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
packrip.eth
Balance
1 FEWRASS
0x27c30763dcEf725E4cf55FF22a7294cF1E00cd9D
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:
FirstEditionWrasslers

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : FirstEditionWrasslers.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/*
.                                                                                                                                          .
.  .cxxo.                 ;dxxo:cdxxdxxxxxo::dxxc.   .ldxxxdxxxxxo' 'oxxxxxxxxxxxl.   .cdxxl.      .ldxxxxxxo::dxxxxxxxxo:cdxxxxxxxxxd:.   .
.  .OMMX;               .dNMMXkONMMMMMMMMXkONMMM0'  ;0WMMMWMMWMWKc'cKWMMMMMMMMMW0;   ,kWMW0;      ;0WMMMMMMXkONMMMMMMMWXkONMMMMMMMMMNx'    .
.  .OMMX;    .,,,.     ;OWMW0kKWMWXXWMMW0k0WMMMM0'.oXMWXdcccccc:''xNMWWKocccccc:.  .cKWMNx.     .oXMMXxcccldKWMWXXWWMW0k0WMWOlcccccc;.     .
.  .OMMX:   ;ONWWk.  .lXWMNOkXWMN0KNWMNOkXWWMMWM0lkWMMW0occcccc,:0WWWNXOlcccccc.  .xNMWKc.     'kWMW0;   .lXWMNKKNWWXxxXWMMXxcccccc:.      .
.  .OMMX: .oXMMMMO. 'kWMWKk0NMMWNNWMWKk0NMW0ONMM0kXMMMMMMMMMMMWOkWMMMMWMMMMMMMWl.:0WMWk'     .cKWMWk'   'kWMMMNNWMW0:'kMMMMMMMMMMMMX;      .
.  .OMMX:,kWMMMMMO,cKWMNOkKWMMMMMMWXOkKWMNx':XMM0ooxxxxxxONMMMNocdxxxxxxx0WMMMXodXMMXo.     .xNMMMW0kxclKWMMMMMMWXx. .cxxxxxxkKWMMWO'      .
.  .OMMN0KWMNNWMMX0NMWXkONMMKx0WMM0okNMMKl. ;XMM0:',,.  'xNMWKc..','.   ,OWMWKk0WMW0;      ;0WMMWWWWXkONMWKxOWMMO;.'''.     .cKWMNx'       .
.  .OMMMMMWKloNMMMMMW0kKWMWO, lNMMXXWMWO,   ;XMM0kKNNk';0WMWk,  lXNNo..lKWMNOkXMMNd.     .oXMMXd:::cdKWMWO, cNMMx.oNNNo    .dNMMXl.        .
.  .OMMMMWO, :NMMWWXkkXWMXo.  lNMMMMMXo.    ;XMM0kNMMXOXMWXo.   oWMWK0KNMWKkONWMWXdllll;;kWMMWKdlllxXMMXo.  cNMWx'dWMW0ollo0WMWO,          .
.  .OMMMXo.  :NMMWKk0WMW0;    lNMMWW0;      ;XMM0kNMMMMMW0;     oWMMMMMMN0kKWMMMMMMMMNOkXWMMMMMMMMMMMW0;    cNMMx'dWMMMMMMMMWXo.           .
.  .:ooo,    .looc;:oooc.     'ooool.       .looc:loooooc.      ,ooooooo:;coooooooooo:;loooooooooooooc.     'loo;.,oooooooooo;             .
.                                                                                                                                          .*/

import "@rari-capital/solmate/src/tokens/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

import {ERC721EnumerableEssential} from "../Libraries/ERC721EnumerableEssential.sol";
import {SignedAllowance} from "../Libraries/SignedAllowance.sol";

contract FirstEditionWrasslers is ERC721, Ownable, SignedAllowance, ERC721EnumerableEssential {
    using Strings for uint256;
    uint256 public constant MAX_SUPPLY = 2100;
    uint256 public nextTokenId;
    string public baseUri;
    address public draftVault;
    address public p2mVault;
    address public auctionVault;

    struct Claim {
        uint256 tokenId;
        bytes signature;
        address minter;
    }

    constructor() ERC721("First Edition Wrasslers", "FEWRASS") {
        draftVault = msg.sender;
        _setAllowancesSigner(msg.sender);
        ++nextTokenId;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return bytes(baseUri).length > 0 ? string(abi.encodePacked(baseUri, tokenId.toString())) : "";
    }

    /**
     * @notice Signed allowance disbursement based on L2 data
     * @dev Each of the mint paths depends on Layer 2 data that
     * assigns a tokenId to a minter address. Card packs, P2M
     * and public auctions all emit TokenAssigned events that
     * our off-chain infrastructure handles by creating signatures
     * and submitting transactions to transfer tokens to their assigned
     * owner address.
     */
    function claimMultiple(Claim[] memory claims) external {
        uint256 l = claims.length;

        for (uint256 i = 0; i < l; ) {
            Claim memory c = claims[i];

            _useAllowance(c.minter, c.tokenId, c.signature);
            _ownerOf[c.tokenId] = c.minter;
            emit Transfer(draftVault, c.minter, c.tokenId);
            unchecked {
                _balanceOf[c.minter] += l;
                i++;
            }
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override {
        _beforeTokenTransfer(from, to, id);
        ERC721.transferFrom(from, to, id);
    }

    /**
     * @notice Admin function for minting tokens to draftPool EOA
     * @dev We want to provide mint pass holders transparency into
     * mintable tokens. When we "mint" to our draftPool, we perform
     * the bare minimum to ensure popular marketplaces index the
     * new tokens. We save gas by not writing to storage at all.
     */
    function mintToPool(uint256 count) external {
        // Indexers prefer mint events where Transfer#to == msg.sender
        // to prevent spam. Only callable by destination EOA which
        // is different from contract owner
        require(msg.sender == draftVault, "Admin Only");
        require(nextTokenId + count - 1 <= MAX_SUPPLY);
        uint256 nextLoopId = nextTokenId + count;
        for (uint256 id = nextTokenId; id < nextLoopId; ) {
            emit Transfer(address(0), msg.sender, id);
            unchecked {
                ++id;
            }
        }
        _tokenCounter += count;
        nextTokenId = nextLoopId;
    }

    /// @notice sets allowance signer, this can be used to revoke all unused allowances already out there
    /// @param newSigner the new signer
    function setAllowancesSigner(address newSigner) external onlyOwner {
        _setAllowancesSigner(newSigner);
    }

    function setDraftVault(address _draftVault) external onlyOwner {
        draftVault = _draftVault;
    }

    function setBaseURI(string calldata _uri) external onlyOwner {
        baseUri = _uri;
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        address owner = _ownerOf[tokenId];
        if (owner == address(0) && tokenId < nextTokenId) {
            return draftVault;
        }
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        require(tokenId > 0, "ERC721: owner query for nonexistent token");
        return tokenId < nextTokenId;
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 2 of 8 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

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

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 3 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 8 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        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_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 5 of 8 : ERC721EnumerableEssential.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

import "@rari-capital/solmate/src/tokens/ERC721.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability ONLY FOR token ids owned by each account as an alternative to OZ.
 * The ineffecient totalSupply is replaced with a simple counter.
 */
abstract contract ERC721EnumerableEssential is ERC721 {
    // Mapping from owner to indexed list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) internal _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256 internal _tokenCounter;

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        if (from != to) {
            if (to == address(0)) {
                --_tokenCounter;
            } else {
                // _addTokenToOwnerEnumeration(to, tokenId);
            }

            if (from == address(0)) {
                ++_tokenCounter;
            } else {
                // _removeTokenFromOwnerEnumeration(from, tokenId);
            }
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }
}

File 6 of 8 : SignedAllowance.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

/// @title SignedAllowance
/// @author Simon Fremaux (@dievardump)
contract SignedAllowance {
    using ECDSA for bytes32;

    // list of already used allowances
    mapping(bytes32 => bool) public usedAllowances;

    // address used to sign the allowances
    address private _allowancesSigner;

    /// @notice Helper to know allowancesSigner address
    /// @return the allowance signer address
    function allowancesSigner() public view virtual returns (address) {
        return _allowancesSigner;
    }

    /// @notice Helper that creates the message that signer needs to sign to allow a mint
    ///         this is usually also used when creating the allowances, to ensure "message"
    ///         is the same
    /// @param account the account to allow
    /// @param nonce the nonce
    /// @param _for contract address where the allowance can be used
    /// @return the message to sign
    function createMessage(
        address account,
        uint256 nonce,
        address _for
    ) public pure returns (bytes32) {
        return keccak256(abi.encode(account, nonce, _for));
    }

    /// @notice Helper that creates a list of messages that signer needs to sign to allow mintings
    /// @param accounts the accounts to allow
    /// @param nonces the corresponding nonces
    /// @return messages the messages to sign
    function createMessages(
        address[] memory accounts,
        uint256[] memory nonces,
        address _for
    ) internal pure returns (bytes32[] memory messages) {
        require(accounts.length == nonces.length, "!LENGTH_MISMATCH!");
        messages = new bytes32[](accounts.length);
        for (uint256 i; i < accounts.length; i++) {
            messages[i] = createMessage(accounts[i], nonces[i], _for);
        }
    }

    /// @notice This function verifies that the current request is valid
    /// @dev It ensures that _allowancesSigner signed a message containing (account, nonce, address(this))
    ///      and that this message was not already used
    /// @param account the account the allowance is associated to
    /// @param nonce the nonce associated to this allowance
    /// @param signature the signature by the allowance signer wallet
    /// @return bool whether the signature is valid
    function validateSignature(
        address account,
        uint256 nonce,
        bytes memory signature
    ) external view returns (bool) {
        _validateSignature(account, nonce, signature);
        return true;
    }

    /// @dev It ensures that signer signed a message containing (account, nonce, address(this))
    ///      and that this message was not already used
    /// @param account the account the allowance is associated to
    /// @param nonce the nonce associated to this allowance
    /// @param signature the signature by the allowance signer wallet
    /// @return the message to mark as used
    function _validateSignature(
        address account,
        uint256 nonce,
        bytes memory signature
    ) internal view returns (bytes32) {
        bytes32 message = createMessage(account, nonce, address(this)).toEthSignedMessageHash();

        require(message.recover(signature) == allowancesSigner(), "!INVALID_SIGNATURE!");
        require(usedAllowances[message] == false, "!ALREADY_USED!");

        return message;
    }

    /// @notice internal function that verifies an allowance and marks it as used
    ///         this function throws if signature is wrong or this nonce for this user has already been used
    /// @param account the account the allowance is associated to
    /// @param nonce the nonce
    /// @param signature the signature by the allowance wallet
    function _useAllowance(
        address account,
        uint256 nonce,
        bytes memory signature
    ) internal {
        bytes32 message = _validateSignature(account, nonce, signature);
        usedAllowances[message] = true;
    }

    /// @notice Allows to change the allowance signer. This can be used to revoke any signed allowance not already used
    /// @param newSigner the new signer address
    function _setAllowancesSigner(address newSigner) internal {
        _allowancesSigner = newSigner;
    }
}

File 7 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 8 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowancesSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"minter","type":"address"}],"internalType":"struct FirstEditionWrasslers.Claim[]","name":"claims","type":"tuple[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"_for","type":"address"}],"name":"createMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"draftVault","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"p2mVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"newSigner","type":"address"}],"name":"setAllowancesSigner","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_draftVault","type":"address"}],"name":"setDraftVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedAllowances","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601781526020017f46697273742045646974696f6e2057726173736c657273000000000000000000815250604051806040016040528060078152602001664645575241535360c81b8152508160009081620000799190620001dd565b506001620000888282620001dd565b505050620000a56200009f620000e260201b60201c565b620000e6565b600e8054336001600160a01b03199182168117909255600880549091169091179055600c60008154620000d890620002a9565b90915550620002d1565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200016357607f821691505b6020821081036200018457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001d857600081815260208120601f850160051c81016020861015620001b35750805b601f850160051c820191505b81811015620001d457828155600101620001bf565b5050505b505050565b81516001600160401b03811115620001f957620001f962000138565b62000211816200020a84546200014e565b846200018a565b602080601f831160018114620002495760008415620002305750858301515b600019600386901b1c1916600185901b178555620001d4565b600085815260208120601f198616915b828110156200027a5788860151825594840194600190910190840162000259565b5085821015620002995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201620002ca57634e487b7160e01b600052601160045260246000fd5b5060010190565b61202d80620002e16000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a5780639abc8320116100ad578063da90491b1161007c578063da90491b14610431578063ddb5d05f14610444578063e985e9c514610457578063eaa626c914610485578063f2fde38b1461049857600080fd5b80639abc8320146103f0578063a22cb465146103f8578063b88d4fde1461040b578063c87b56dd1461041e57600080fd5b80638838b5c3116100e95780638838b5c3146103b3578063890621da146103c45780638da5cb5b146103d757806395d89b41146103e857600080fd5b80636352211e1461037c57806370a082311461038f578063715018a6146103a257806375794a3c146103aa57600080fd5b806323b872dd1161019257806348a220a41161016157806348a220a41461033057806355298d4c1461034357806355f804b31461035657806358f3fc811461036957600080fd5b806323b872dd146102ee5780632f745c591461030157806332cb6b0c1461031457806342842e0e1461031d57600080fd5b806318160ddd116101ce57806318160ddd14610293578063195e8708146102a55780631ab89524146102c85780632073447d146102db57600080fd5b806301ffc9a71461020057806306fdde0314610228578063081812fc1461023d578063095ea7b31461027e575b600080fd5b61021361020e36600461174b565b6104ab565b60405190151581526020015b60405180910390f35b6102306104bc565b60405161021f9190611793565b61026661024b3660046117c6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b61029161028c3660046117fb565b61054a565b005b600b545b60405190815260200161021f565b6102136102b33660046117c6565b60076020526000908152604090205460ff1681565b6102916102d6366004611825565b610631565b6102916102e9366004611825565b61067d565b6102916102fc366004611840565b6106c8565b61029761030f3660046117fb565b6106e3565b61029761083481565b61029161032b366004611840565b610779565b601054610266906001600160a01b031681565b61029161035136600461195c565b61086c565b610291610364366004611ab0565b61093c565b600e54610266906001600160a01b031681565b61026661038a3660046117c6565b610973565b61029761039d366004611825565b6109d8565b610291610a3b565b610297600c5481565b6008546001600160a01b0316610266565b6102136103d2366004611af2565b610a71565b6006546001600160a01b0316610266565b610230610a89565b610230610a96565b610291610406366004611b49565b610aa3565b610291610419366004611b85565b610b0f565b61023061042c3660046117c6565b610bf7565b600f54610266906001600160a01b031681565b6102916104523660046117c6565b610cc2565b610213610465366004611bf4565b600560209081526000928352604080842090915290825290205460ff1681565b610297610493366004611c27565b610da5565b6102916104a6366004611825565b610dec565b60006104b682610e84565b92915050565b600080546104c990611c63565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590611c63565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061059357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105d55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b0316331461065b5760405162461bcd60e51b81526004016105cc90611c9d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146106a75760405162461bcd60e51b81526004016105cc90611c9d565b600880546001600160a01b0319166001600160a01b03831617905550565b50565b6106d3838383610ed2565b6106de838383610f33565b505050565b60006106ee836109d8565b82106107505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105cc565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6107848383836106c8565b6001600160a01b0382163b158061082d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190611cd2565b6001600160e01b031916145b6106de5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b805160005b818110156106de57600083828151811061088d5761088d611cef565b602002602001015190506108ae8160400151826000015183602001516110fa565b6040818101805183516000908152600260205283812080546001600160a01b0319166001600160a01b0393841617905584519251600e5494519394908316939216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a46040908101516001600160a01b03166000908152600360205220805483019055600101610871565b6006546001600160a01b031633146109665760405162461bcd60e51b81526004016105cc90611c9d565b600d6106de828483611d53565b6000818152600260205260408120546001600160a01b03168015801561099a5750600c5483105b156109b2575050600e546001600160a01b0316919050565b6001600160a01b0381166104b65760405162461bcd60e51b81526004016105cc90611e13565b60006001600160a01b038216610a1f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016105cc565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a655760405162461bcd60e51b81526004016105cc90611c9d565b610a6f6000611126565b565b6000610a7e848484611178565b506001949350505050565b600180546104c990611c63565b600d80546104c990611c63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b1a8585856106c8565b6001600160a01b0384163b1580610bb15750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610b629033908a90899089908990600401611e5c565b6020604051808303816000875af1158015610b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba59190611cd2565b6001600160e01b031916145b610bf05760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b5050505050565b6060610c02826112a7565b610c665760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105cc565b6000600d8054610c7590611c63565b905011610c9157604051806020016040528060008152506104b6565b600d610c9c836112d0565b604051602001610cad929190611eb0565b60405160208183030381529060405292915050565b600e546001600160a01b03163314610d095760405162461bcd60e51b815260206004820152600a60248201526941646d696e204f6e6c7960b01b60448201526064016105cc565b610834600182600c54610d1c9190611f4d565b610d269190611f60565b1115610d3157600080fd5b600081600c54610d419190611f4d565b600c549091505b81811015610d8757604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610d48565b5081600b6000828254610d9a9190611f4d565b9091555050600c5550565b604080516001600160a01b03808616602083015291810184905290821660608201526000906080016040516020818303038152906040528051906020012090509392505050565b6006546001600160a01b03163314610e165760405162461bcd60e51b81526004016105cc90611c9d565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cc565b6106c581611126565b60006301ffc9a760e01b6001600160e01b031983161480610eb557506380ac58cd60e01b6001600160e01b03198316145b806104b65750506001600160e01b031916635b5e139f60e01b1490565b816001600160a01b0316836001600160a01b0316146106de576001600160a01b038216610f0d57600b60008154610f0890611f73565b909155505b6001600160a01b0383166106de57600b60008154610f2a90611f8a565b90915550505050565b6000818152600260205260409020546001600160a01b03848116911614610f895760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016105cc565b6001600160a01b038216610fd35760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016105cc565b336001600160a01b038416148061100d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061102e57506000818152600460205260409020546001600160a01b031633145b61106b5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016105cc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611107848484611178565b6000908152600760205260409020805460ff1916600117905550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111dc611189868630610da5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506111f06008546001600160a01b031690565b6001600160a01b031661120382856113d1565b6001600160a01b03161461124f5760405162461bcd60e51b815260206004820152601360248201527221494e56414c49445f5349474e41545552452160681b60448201526064016105cc565b60008181526007602052604090205460ff161561129f5760405162461bcd60e51b815260206004820152600e60248201526d21414c52454144595f555345442160901b60448201526064016105cc565b949350505050565b60008082116112c85760405162461bcd60e51b81526004016105cc90611e13565b50600c541190565b6060816000036112f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611321578061130b81611f8a565b915061131a9050600a83611fb9565b91506112fb565b60008167ffffffffffffffff81111561133c5761133c61187c565b6040519080825280601f01601f191660200182016040528015611366576020820181803683370190505b5090505b841561129f5761137b600183611f60565b9150611388600a86611fcd565b611393906030611f4d565b60f81b8183815181106113a8576113a8611cef565b60200101906001600160f81b031916908160001a9053506113ca600a86611fb9565b945061136a565b60008060006113e085856113f5565b915091506113ed81611463565b509392505050565b600080825160410361142b5760208301516040840151606085015160001a61141f87828585611619565b9450945050505061145c565b82516040036114545760208301516040840151611449868383611706565b93509350505061145c565b506000905060025b9250929050565b600081600481111561147757611477611fe1565b0361147f5750565b600181600481111561149357611493611fe1565b036114e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105cc565b60028160048111156114f4576114f4611fe1565b036115415760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105cc565b600381600481111561155557611555611fe1565b036115ad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105cc565b60048160048111156115c1576115c1611fe1565b036106c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105cc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561165057506000905060036116fd565b8460ff16601b1415801561166857508460ff16601c14155b1561167957506000905060046116fd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156116cd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116f6576000600192509250506116fd565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161172787828885611619565b935093505050935093915050565b6001600160e01b0319811681146106c557600080fd5b60006020828403121561175d57600080fd5b813561176881611735565b9392505050565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6000602082840312156117d857600080fd5b5035919050565b80356001600160a01b03811681146117f657600080fd5b919050565b6000806040838503121561180e57600080fd5b611817836117df565b946020939093013593505050565b60006020828403121561183757600080fd5b611768826117df565b60008060006060848603121561185557600080fd5b61185e846117df565b925061186c602085016117df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118b5576118b561187c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e4576118e461187c565b604052919050565b600082601f8301126118fd57600080fd5b813567ffffffffffffffff8111156119175761191761187c565b61192a601f8201601f19166020016118bb565b81815284602083860101111561193f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561196f57600080fd5b823567ffffffffffffffff8082111561198757600080fd5b818501915085601f83011261199b57600080fd5b8135818111156119ad576119ad61187c565b8060051b6119bc8582016118bb565b91825283810185019185810190898411156119d657600080fd5b86860192505b83831015611a61578235858111156119f45760008081fd5b86016060818c03601f1901811315611a0c5760008081fd5b611a14611892565b89830135815260408084013589811115611a2e5760008081fd5b611a3c8f8d838801016118ec565b8c84015250611a4c8385016117df565b908201528452505091860191908601906119dc565b9998505050505050505050565b60008083601f840112611a8057600080fd5b50813567ffffffffffffffff811115611a9857600080fd5b60208301915083602082850101111561145c57600080fd5b60008060208385031215611ac357600080fd5b823567ffffffffffffffff811115611ada57600080fd5b611ae685828601611a6e565b90969095509350505050565b600080600060608486031215611b0757600080fd5b611b10846117df565b925060208401359150604084013567ffffffffffffffff811115611b3357600080fd5b611b3f868287016118ec565b9150509250925092565b60008060408385031215611b5c57600080fd5b611b65836117df565b915060208301358015158114611b7a57600080fd5b809150509250929050565b600080600080600060808688031215611b9d57600080fd5b611ba6866117df565b9450611bb4602087016117df565b935060408601359250606086013567ffffffffffffffff811115611bd757600080fd5b611be388828901611a6e565b969995985093965092949392505050565b60008060408385031215611c0757600080fd5b611c10836117df565b9150611c1e602084016117df565b90509250929050565b600080600060608486031215611c3c57600080fd5b611c45846117df565b925060208401359150611c5a604085016117df565b90509250925092565b600181811c90821680611c7757607f821691505b602082108103611c9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ce457600080fd5b815161176881611735565b634e487b7160e01b600052603260045260246000fd5b601f8211156106de57600081815260208120601f850160051c81016020861015611d2c5750805b601f850160051c820191505b81811015611d4b57828155600101611d38565b505050505050565b67ffffffffffffffff831115611d6b57611d6b61187c565b611d7f83611d798354611c63565b83611d05565b6000601f841160018114611db35760008515611d9b5750838201355b600019600387901b1c1916600186901b178355610bf0565b600083815260209020601f19861690835b82811015611de45786850135825560209485019460019092019101611dc4565b5086821015611e015760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808454611ebe81611c63565b60018281168015611ed65760018114611eeb57611f1a565b60ff1984168752821515830287019450611f1a565b8860005260208060002060005b85811015611f115781548a820152908401908201611ef8565b50505082870194505b505050508351611f2e81836020880161176f565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104b6576104b6611f37565b818103818111156104b6576104b6611f37565b600081611f8257611f82611f37565b506000190190565b600060018201611f9c57611f9c611f37565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611fc857611fc8611fa3565b500490565b600082611fdc57611fdc611fa3565b500690565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220713c3817947c5737245e9f5df623445290a859dd719ad16f2c277d9977070ef064736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a5780639abc8320116100ad578063da90491b1161007c578063da90491b14610431578063ddb5d05f14610444578063e985e9c514610457578063eaa626c914610485578063f2fde38b1461049857600080fd5b80639abc8320146103f0578063a22cb465146103f8578063b88d4fde1461040b578063c87b56dd1461041e57600080fd5b80638838b5c3116100e95780638838b5c3146103b3578063890621da146103c45780638da5cb5b146103d757806395d89b41146103e857600080fd5b80636352211e1461037c57806370a082311461038f578063715018a6146103a257806375794a3c146103aa57600080fd5b806323b872dd1161019257806348a220a41161016157806348a220a41461033057806355298d4c1461034357806355f804b31461035657806358f3fc811461036957600080fd5b806323b872dd146102ee5780632f745c591461030157806332cb6b0c1461031457806342842e0e1461031d57600080fd5b806318160ddd116101ce57806318160ddd14610293578063195e8708146102a55780631ab89524146102c85780632073447d146102db57600080fd5b806301ffc9a71461020057806306fdde0314610228578063081812fc1461023d578063095ea7b31461027e575b600080fd5b61021361020e36600461174b565b6104ab565b60405190151581526020015b60405180910390f35b6102306104bc565b60405161021f9190611793565b61026661024b3660046117c6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b61029161028c3660046117fb565b61054a565b005b600b545b60405190815260200161021f565b6102136102b33660046117c6565b60076020526000908152604090205460ff1681565b6102916102d6366004611825565b610631565b6102916102e9366004611825565b61067d565b6102916102fc366004611840565b6106c8565b61029761030f3660046117fb565b6106e3565b61029761083481565b61029161032b366004611840565b610779565b601054610266906001600160a01b031681565b61029161035136600461195c565b61086c565b610291610364366004611ab0565b61093c565b600e54610266906001600160a01b031681565b61026661038a3660046117c6565b610973565b61029761039d366004611825565b6109d8565b610291610a3b565b610297600c5481565b6008546001600160a01b0316610266565b6102136103d2366004611af2565b610a71565b6006546001600160a01b0316610266565b610230610a89565b610230610a96565b610291610406366004611b49565b610aa3565b610291610419366004611b85565b610b0f565b61023061042c3660046117c6565b610bf7565b600f54610266906001600160a01b031681565b6102916104523660046117c6565b610cc2565b610213610465366004611bf4565b600560209081526000928352604080842090915290825290205460ff1681565b610297610493366004611c27565b610da5565b6102916104a6366004611825565b610dec565b60006104b682610e84565b92915050565b600080546104c990611c63565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590611c63565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061059357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105d55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b0316331461065b5760405162461bcd60e51b81526004016105cc90611c9d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146106a75760405162461bcd60e51b81526004016105cc90611c9d565b600880546001600160a01b0319166001600160a01b03831617905550565b50565b6106d3838383610ed2565b6106de838383610f33565b505050565b60006106ee836109d8565b82106107505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105cc565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6107848383836106c8565b6001600160a01b0382163b158061082d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190611cd2565b6001600160e01b031916145b6106de5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b805160005b818110156106de57600083828151811061088d5761088d611cef565b602002602001015190506108ae8160400151826000015183602001516110fa565b6040818101805183516000908152600260205283812080546001600160a01b0319166001600160a01b0393841617905584519251600e5494519394908316939216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a46040908101516001600160a01b03166000908152600360205220805483019055600101610871565b6006546001600160a01b031633146109665760405162461bcd60e51b81526004016105cc90611c9d565b600d6106de828483611d53565b6000818152600260205260408120546001600160a01b03168015801561099a5750600c5483105b156109b2575050600e546001600160a01b0316919050565b6001600160a01b0381166104b65760405162461bcd60e51b81526004016105cc90611e13565b60006001600160a01b038216610a1f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016105cc565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a655760405162461bcd60e51b81526004016105cc90611c9d565b610a6f6000611126565b565b6000610a7e848484611178565b506001949350505050565b600180546104c990611c63565b600d80546104c990611c63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b1a8585856106c8565b6001600160a01b0384163b1580610bb15750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610b629033908a90899089908990600401611e5c565b6020604051808303816000875af1158015610b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba59190611cd2565b6001600160e01b031916145b610bf05760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b5050505050565b6060610c02826112a7565b610c665760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105cc565b6000600d8054610c7590611c63565b905011610c9157604051806020016040528060008152506104b6565b600d610c9c836112d0565b604051602001610cad929190611eb0565b60405160208183030381529060405292915050565b600e546001600160a01b03163314610d095760405162461bcd60e51b815260206004820152600a60248201526941646d696e204f6e6c7960b01b60448201526064016105cc565b610834600182600c54610d1c9190611f4d565b610d269190611f60565b1115610d3157600080fd5b600081600c54610d419190611f4d565b600c549091505b81811015610d8757604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610d48565b5081600b6000828254610d9a9190611f4d565b9091555050600c5550565b604080516001600160a01b03808616602083015291810184905290821660608201526000906080016040516020818303038152906040528051906020012090509392505050565b6006546001600160a01b03163314610e165760405162461bcd60e51b81526004016105cc90611c9d565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cc565b6106c581611126565b60006301ffc9a760e01b6001600160e01b031983161480610eb557506380ac58cd60e01b6001600160e01b03198316145b806104b65750506001600160e01b031916635b5e139f60e01b1490565b816001600160a01b0316836001600160a01b0316146106de576001600160a01b038216610f0d57600b60008154610f0890611f73565b909155505b6001600160a01b0383166106de57600b60008154610f2a90611f8a565b90915550505050565b6000818152600260205260409020546001600160a01b03848116911614610f895760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016105cc565b6001600160a01b038216610fd35760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016105cc565b336001600160a01b038416148061100d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061102e57506000818152600460205260409020546001600160a01b031633145b61106b5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016105cc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611107848484611178565b6000908152600760205260409020805460ff1916600117905550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111dc611189868630610da5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506111f06008546001600160a01b031690565b6001600160a01b031661120382856113d1565b6001600160a01b03161461124f5760405162461bcd60e51b815260206004820152601360248201527221494e56414c49445f5349474e41545552452160681b60448201526064016105cc565b60008181526007602052604090205460ff161561129f5760405162461bcd60e51b815260206004820152600e60248201526d21414c52454144595f555345442160901b60448201526064016105cc565b949350505050565b60008082116112c85760405162461bcd60e51b81526004016105cc90611e13565b50600c541190565b6060816000036112f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611321578061130b81611f8a565b915061131a9050600a83611fb9565b91506112fb565b60008167ffffffffffffffff81111561133c5761133c61187c565b6040519080825280601f01601f191660200182016040528015611366576020820181803683370190505b5090505b841561129f5761137b600183611f60565b9150611388600a86611fcd565b611393906030611f4d565b60f81b8183815181106113a8576113a8611cef565b60200101906001600160f81b031916908160001a9053506113ca600a86611fb9565b945061136a565b60008060006113e085856113f5565b915091506113ed81611463565b509392505050565b600080825160410361142b5760208301516040840151606085015160001a61141f87828585611619565b9450945050505061145c565b82516040036114545760208301516040840151611449868383611706565b93509350505061145c565b506000905060025b9250929050565b600081600481111561147757611477611fe1565b0361147f5750565b600181600481111561149357611493611fe1565b036114e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105cc565b60028160048111156114f4576114f4611fe1565b036115415760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105cc565b600381600481111561155557611555611fe1565b036115ad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105cc565b60048160048111156115c1576115c1611fe1565b036106c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105cc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561165057506000905060036116fd565b8460ff16601b1415801561166857508460ff16601c14155b1561167957506000905060046116fd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156116cd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116f6576000600192509250506116fd565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161172787828885611619565b935093505050935093915050565b6001600160e01b0319811681146106c557600080fd5b60006020828403121561175d57600080fd5b813561176881611735565b9392505050565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6000602082840312156117d857600080fd5b5035919050565b80356001600160a01b03811681146117f657600080fd5b919050565b6000806040838503121561180e57600080fd5b611817836117df565b946020939093013593505050565b60006020828403121561183757600080fd5b611768826117df565b60008060006060848603121561185557600080fd5b61185e846117df565b925061186c602085016117df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118b5576118b561187c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e4576118e461187c565b604052919050565b600082601f8301126118fd57600080fd5b813567ffffffffffffffff8111156119175761191761187c565b61192a601f8201601f19166020016118bb565b81815284602083860101111561193f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561196f57600080fd5b823567ffffffffffffffff8082111561198757600080fd5b818501915085601f83011261199b57600080fd5b8135818111156119ad576119ad61187c565b8060051b6119bc8582016118bb565b91825283810185019185810190898411156119d657600080fd5b86860192505b83831015611a61578235858111156119f45760008081fd5b86016060818c03601f1901811315611a0c5760008081fd5b611a14611892565b89830135815260408084013589811115611a2e5760008081fd5b611a3c8f8d838801016118ec565b8c84015250611a4c8385016117df565b908201528452505091860191908601906119dc565b9998505050505050505050565b60008083601f840112611a8057600080fd5b50813567ffffffffffffffff811115611a9857600080fd5b60208301915083602082850101111561145c57600080fd5b60008060208385031215611ac357600080fd5b823567ffffffffffffffff811115611ada57600080fd5b611ae685828601611a6e565b90969095509350505050565b600080600060608486031215611b0757600080fd5b611b10846117df565b925060208401359150604084013567ffffffffffffffff811115611b3357600080fd5b611b3f868287016118ec565b9150509250925092565b60008060408385031215611b5c57600080fd5b611b65836117df565b915060208301358015158114611b7a57600080fd5b809150509250929050565b600080600080600060808688031215611b9d57600080fd5b611ba6866117df565b9450611bb4602087016117df565b935060408601359250606086013567ffffffffffffffff811115611bd757600080fd5b611be388828901611a6e565b969995985093965092949392505050565b60008060408385031215611c0757600080fd5b611c10836117df565b9150611c1e602084016117df565b90509250929050565b600080600060608486031215611c3c57600080fd5b611c45846117df565b925060208401359150611c5a604085016117df565b90509250925092565b600181811c90821680611c7757607f821691505b602082108103611c9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ce457600080fd5b815161176881611735565b634e487b7160e01b600052603260045260246000fd5b601f8211156106de57600081815260208120601f850160051c81016020861015611d2c5750805b601f850160051c820191505b81811015611d4b57828155600101611d38565b505050505050565b67ffffffffffffffff831115611d6b57611d6b61187c565b611d7f83611d798354611c63565b83611d05565b6000601f841160018114611db35760008515611d9b5750838201355b600019600387901b1c1916600186901b178355610bf0565b600083815260209020601f19861690835b82811015611de45786850135825560209485019460019092019101611dc4565b5086821015611e015760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808454611ebe81611c63565b60018281168015611ed65760018114611eeb57611f1a565b60ff1984168752821515830287019450611f1a565b8860005260208060002060005b85811015611f115781548a820152908401908201611ef8565b50505082870194505b505050508351611f2e81836020880161176f565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104b6576104b6611f37565b818103818111156104b6576104b6611f37565b600081611f8257611f82611f37565b506000190190565b600060018201611f9c57611f9c611f37565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611fc857611fc8611fa3565b500490565b600082611fdc57611fdc611fa3565b500690565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220713c3817947c5737245e9f5df623445290a859dd719ad16f2c277d9977070ef064736f6c63430008110033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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