ETH Price: $3,306.73 (-3.06%)
Gas: 14 Gwei

Token

Presale CheezeWizard ()
 

Overview

Max Total Supply

0 Presale CheezeWizard

Holders

986

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
yitong.eth
Balance
0 Presale CheezeWizard
0xc3fdadbae46798cd8762185a09c5b672a7aa36bb
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Each Cheeze Wizard is special. They’re immortal, magical, and capable of world-changing feats. Sadly, they spend most of their time getting into petty disagreements online.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WizardPresale

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
constantinople EvmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-05-18
*/

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol

pragma solidity ^0.5.2;

/**
 * @title IERC165
 * @dev https://eips.ethereum.org/EIPS/eip-165
 */
interface IERC165 {
    /**
     * @notice Query if a contract implements an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.2;


/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);

    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);

    function transferFrom(address from, address to, uint256 tokenId) public;
    function safeTransferFrom(address from, address to, uint256 tokenId) public;

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.2;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safeTransfer`. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.2;


/**
 * @title ERC165
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    /*
     * 0x01ffc9a7 ===
     *     bytes4(keccak256('supportsInterface(bytes4)'))
     */

    /**
     * @dev a mapping of interface id to whether or not it's supported
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev A contract implementing SupportsInterfaceWithLookup
     * implement ERC165 itself
     */
    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev implement supportsInterface(bytes4) using a lookup table
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev internal method for registering an interface
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff);
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.2;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

// File: contracts/WizardPresaleNFT.sol

pragma solidity >=0.5.6 <0.6.0;






/**
 * @title WizardPresaleNFT
 * @notice The basic ERC-721 functionality for storing the presale Wizard NFTs.
 *     Derived from: https://github.com/OpenZeppelin/openzeppelin-solidity/tree/v2.2.0
 */
contract WizardPresaleNFT is ERC165, IERC721 {

    using Address for address;

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /// @notice Emitted when a wizard token is created.
    event WizardSummoned(uint256 indexed tokenId, uint8 element, uint256 power);

    /// @notice Emitted when a wizard change element. Should only happen once and for wizards
    ///         that previously had the element undefined.
    event WizardAlignmentAssigned(uint256 indexed tokenId, uint8 element);

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 internal constant _ERC721_RECEIVED = 0x150b7a02;

    /// @dev The presale Wizard structure.
    ///  Fits in one word
    struct Wizard {
        // NOTE: Changing the order or meaning of any of these fields requires an update
        //   to the _createWizard() function which assumes a specific order for these fields.
        uint8 affinity;
        uint88 power;
        address owner;
    }

    // Mapping from Wizard ID to Wizard struct
    mapping (uint256 => Wizard) public _wizardsById;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => uint256) internal _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    /*
     * 0x80ac58cd ===
     *     bytes4(keccak256('balanceOf(address)')) ^
     *     bytes4(keccak256('ownerOf(uint256)')) ^
     *     bytes4(keccak256('approve(address,uint256)')) ^
     *     bytes4(keccak256('getApproved(uint256)')) ^
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) ^
     *     bytes4(keccak256('isApprovedForAll(address,address)')) ^
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) ^
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
     */

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _ownedTokensCount[owner];
    }

    /**
     * @dev Gets the owner of the specified token ID
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _wizardsById[tokenId].owner;
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");
        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");
        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _wizardsById[tokenId].owner;
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to burn a specific token
     * Reverts if the token does not exist
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner]--;
        // delete the entire object to recover the most gas
        delete _wizardsById[tokenId];

        // required for ERC721 compatibility
        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Internal function to burn a specific token
     * Reverts if the token does not exist
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from]--;
        _ownedTokensCount[to]++;

        _wizardsById[tokenId].owner = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke `onERC721Received` on a target address
     * The call is not executed if the target address is not a contract
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

// File: contracts/WizardPresaleInterface.sol

pragma solidity >=0.5.6 <0.6.0;


/// @title WizardPresaleInterface
/// @notice This interface represents the single method that the final tournament and master Wizard contracts
///         will use to import the presale wizards when those contracts have been finalized a released on
///         mainnet. Once all presale Wizards have been absorbed, this temporary pre-sale contract can be
///         destroyed.
contract WizardPresaleInterface {

    // See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md on how
    // to calculate this
    bytes4 public constant _INTERFACE_ID_WIZARDPRESALE = 0x4df71efb;

    /// @notice This function is used to bring a presale Wizard into the final contracts. It can
    ///         ONLY be called by the official gatekeeper contract (as set by the Owner of the presale
    ///         contract). It does a number of things:
    ///            1. Check that the presale Wizard exists, and has not already been absorbed
    ///            2. Transfer the Eth used to create the presale Wizard to the caller
    ///            3. Mark the Wizard as having been absorbed, reclaiming the storage used by the presale info
    ///            4. Return the Wizard information (its owner, minting price, and elemental alignment)
    /// @param id the id of the presale Wizard to be absorbed
    function absorbWizard(uint256 id) external returns (address owner, uint256 power, uint8 affinity);

    /// @notice A convenience function that allows multiple Wizards to be moved to the final contracts
    ///         simultaneously, works the same as the previous function, but in a batch.
    /// @param ids An array of ids indicating which presale Wizards are to be absorbed
    function absorbWizardMulti(uint256[] calldata ids) external
        returns (address[] memory owners, uint256[] memory powers, uint8[] memory affinities);

    function powerToCost(uint256 power) public pure returns (uint256 cost);
    function costToPower(uint256 cost) public pure returns (uint256 power);
}

// File: contracts/AddressPayable.sol

pragma solidity >=0.5.6 <0.6.0;

/**
 * Utility library of inline functions on address payables
 * Modified from original by OpenZeppelin
 */
contract AddressPayable {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address payable account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) } // solium-disable-line security/no-inline-assembly
        return size > 0;
    }
}

// File: contracts/WizardConstants.sol

pragma solidity >=0.5.6 <0.6.0;

/// @title The master organization behind wizardry activity, where Wiz come from.
contract WizardConstants {
    uint8 internal constant ELEMENT_NOTSET = 0;
    // need to decide what neutral is because of price difference
    uint8 internal constant ELEMENT_NEUTRAL = 1;
    // no sense in defining these here as they are probably not fixed,
    // all we need to know is that these are not neutral
    uint8 internal constant ELEMENT_FIRE = 2;
    uint8 internal constant ELEMENT_WIND = 3;
    uint8 internal constant ELEMENT_WATER = 4;
    uint8 internal constant MAX_ELEMENT = ELEMENT_WATER;
}

// File: contracts/WizardPresale.sol

pragma solidity >=0.5.6 <0.6.0;





/// @title WizardPresale - Making Cheeze Wizards available for sale!
/// @notice Allows for the creation and sale of Cheeze Wizards before the final tournament
///         contract has been reviewed and released on mainnet. There are three main types
///         of Wizards that are managed by this contract:
///          - Neutral Wizards: Available in unlimited quantities and all have the same
///             innate power. Don't have a natural affinity for any particular elemental
///             spell... or the corresponding weakness!
///          - Elemental Wizards: Available in unlimited quantities, but with a steadily increasing
///             power; the power of an Elemental Wizard is always _slightly_ higher than the power
///             of the previously created Elemental Wizard. Each Elemental Wizard has an Elemental
///             Affinity that gives it a power multiplier when using the associated spell, but also
///             gives it a weakness for the opposing element.
///          - Exclusive Wizards: Only available in VERY limited quantities, with a hard cap set at
///             contract creation time. Exclusive Wizards can ONLY be created by the Guild Master
///             address (the address that created this contract), and are assigned the first N
///             Wizard IDs, starting with 1 (where N is the hard cap on Exclusive Wizards). The first
///             non-exclusive Wizard is assigned the ID N+1. Exclusive Wizards have no starting
///             affinity, and their owners much choose an affinity before they can be entered into a
///             Battle. The affinity CAN NOT CHANGE once it has been selected. The power of Exclusive
///             Wizards is not set by the Guild Master and is not required to follow any pattern (although
///             it can't be lower than the power of Neutral Wizards).
contract WizardPresale is AddressPayable, WizardPresaleNFT, WizardPresaleInterface, WizardConstants {

    /// @dev The ratio between the cost of a Wizard (in wei) and the power of the wizard.
    ///      power = cost / POWER_SCALE
    ///      cost = power * POWER_SCALE
    uint256 private constant POWER_SCALE = 1000;

    /// @dev The unit conversion for tenths of basis points
    uint256 private constant TENTH_BASIS_POINTS = 100000;

    /// @dev The address used to create this smart contract, has permission to conjure Exclusive Wizards,
    ///      set the gatekeeper address, and destroy this contract once the sale is finished and all Presale
    ///      Wizards have been absorbed into the main contracts.
    address payable public guildmaster;

    /// @dev The start block and duration (in blocks) of the sale.
    ///      ACT NOW! For a limited time only!
    uint256 public saleStartBlock;
    uint256 public saleDuration;

    /// @dev The cost of Neutral Wizards (in wei).
    uint256 public neutralWizardCost;

    /// @dev The cost of the _next_ Elemental Wizard (in wei); increases with each Elemental Wizard sold
    uint256 public elementalWizardCost;

    /// @dev The increment ratio in price between sequential Elemental Wizards, multiplied by 100k for
    ///      greater granularity (0 == 0% increase, 100000 == 100% increase, 100 = 0.1% increase, etc.)
    ///      NOTE: This is NOT percentage points, or basis points. It's tenths of a basis point.
    uint256 public elementalWizardIncrement;

    /// @dev The hard cap on how many Exclusive Wizards can be created
    uint256 public maxExclusives;

    /// @dev The ID number of the next Wizard to be created (Neutral or Elemental)
    uint256 public nextWizardId;

    /// @dev The address of the Gatekeeper for the tournament, initially set to address(0).
    ///      To be set by the Guild Master when the final Tournament Contract is deployed on mainnet
    address payable public gatekeeper;

    /// @notice Emitted whenever the start of the sale changes.
    event StartBlockChanged(uint256 oldStartBlock, uint256 newStartBlock);

    /// @param startingCost The minimum cost of a Wizard, used as the price for all Neutral Wizards, and the
    ///        cost of the first Elemental Wizard. Also used as a minimum value for Exclusive Wizards.
    /// @param costIncremement The rate (in tenths of a basis point) at which the price of Elemental Wizards increases
    /// @param exclusiveCount The hard cap on Exclusive Wizards, also dictates the ID of the first non-Exclusive
    /// @param startBlock The starting block of the presale.
    /// @param duration The duration of the presale.  Not changeable!
    constructor(uint128 startingCost,
            uint16 costIncremement,
            uint256 exclusiveCount,
            uint128 startBlock,
            uint128 duration) public
    {
        require(startBlock > block.number, "start must be greater than current block");

        guildmaster = msg.sender;
        saleStartBlock = startBlock;
        saleDuration = duration;
        neutralWizardCost = startingCost;
        elementalWizardCost = startingCost;
        elementalWizardIncrement = costIncremement;
        maxExclusives = exclusiveCount;
        nextWizardId = exclusiveCount + 1;

        _registerInterface(_INTERFACE_ID_WIZARDPRESALE);
    }

    /// @dev Throws if called by any account other than the gatekeeper.
    modifier onlyGatekeeper() {
        require(msg.sender == gatekeeper, "Must be gatekeeper");
        _;
    }

    /// @dev Throws if called by any account other than the guildmaster.
    modifier onlyGuildmaster() {
        require(msg.sender == guildmaster, "Must be guildmaster");
        _;
    }

    /// @dev Checks to see that the current block number is within the range
    ///      [saleStartBlock, saleStartBlock + saleDuraction) indicating that the sale
    ///      is currently active
    modifier onlyDuringSale() {
        // The addtion of start and duration can't overflow since they can only be set from
        // 128-bit arguments.
        require(block.number >= saleStartBlock, "Sale not open yet");
        require(block.number < saleStartBlock + saleDuration, "Sale closed");
        _;
    }

    /// @dev Sets the address of the Gatekeeper contract once the final Tournament contract is live.
    ///      Can only be set once.
    /// @param gc The gatekeeper address to set
    function setGatekeeper(address payable gc) external onlyGuildmaster {
        require(gatekeeper == address(0) && gc != address(0), "Can only set once and must not be zero");
        gatekeeper = gc;
    }

    /// @dev Updates the start block of the sale. The sale can only be postponed; it can't be made earlier.
    /// @param newStart the new start block.
    function postponeSale(uint128 newStart) external onlyGuildmaster {
        require(block.number < saleStartBlock, "Sale start time only adjustable before previous start time");
        require(newStart > saleStartBlock, "New start time must be later than previous start time");

        emit StartBlockChanged(saleStartBlock, newStart);

        saleStartBlock = newStart;
    }

    /// @dev Returns true iff the sale is currently active
    function isDuringSale() external view returns (bool) {
        return (block.number >= saleStartBlock && block.number < saleStartBlock + saleDuration);
    }

    /// @dev Convenience method for getting a presale wizard's data
    /// @param id The wizard id
    function getWizard(uint256 id) public view returns (address owner, uint88 power, uint8 affinity) {
        Wizard memory wizard = _wizardsById[id];
        (owner, power, affinity) = (wizard.owner, wizard.power, wizard.affinity);
        require(wizard.owner != address(0), "Wizard does not exist");
    }

    /// @param cost The price of the wizard in wei
    /// @return The power of the wizard (left as uint256)
    function costToPower(uint256 cost) public pure returns (uint256 power) {
        return cost / POWER_SCALE;
    }

    /// @param power The power of the wizard
    /// @return The cost of the wizard in wei
    function powerToCost(uint256 power) public pure returns (uint256 cost) {
        return power * POWER_SCALE;
    }

    /// @notice This function is used to bring a presale Wizard into the final contracts. It can
    ///         ONLY be called by the official gatekeeper contract (as set by the Owner of the presale
    ///         contract). It does a number of things:
    ///            1. Check that the presale Wizard exists, and has not already been absorbed
    ///            2. Transfer the Eth used to create the presale Wizard to the caller
    ///            3. Mark the Wizard as having been absorbed, reclaiming the storage used by the presale info
    ///            4. Return the Wizard information (its owner, minting price, and elemental alignment)
    /// @param id the id of the presale Wizard to be absorbed
    function absorbWizard(uint256 id) external onlyGatekeeper returns (address owner, uint256 power, uint8 affinity) {
        (owner, power, affinity) = getWizard(id);

        // Free up the storage used by this wizard
        _burn(owner, id);

        // send the price paid to the gatekeeper to be used in the tournament prize pool
        msg.sender.transfer(powerToCost(power));
    }

    /// @notice A convenience function that allows multiple Wizards to be moved to the final contracts
    ///         simultaneously, works the same as the previous function, but in a batch.
    /// @param ids An array of ids indicating which presale Wizards are to be absorbed
    function absorbWizardMulti(uint256[] calldata ids) external onlyGatekeeper
            returns (address[] memory owners, uint256[] memory powers, uint8[] memory affinities)
    {
        // allocate arrays
        owners = new address[](ids.length);
        powers = new uint256[](ids.length);
        affinities = new uint8[](ids.length);

        // The total eth to send (sent in a batch to save gas)
        uint256 totalTransfer;

        // Put the data for each Wizard into the returned arrays
        for (uint256 i = 0; i < ids.length; i++) {
            (owners[i], powers[i], affinities[i]) = getWizard(ids[i]);

            // Free up the storage used by this wizard
            _burn(owners[i], ids[i]);

            // add the amount to transfer
            totalTransfer += powerToCost(powers[i]);
        }

        // Send all the eth together
        msg.sender.transfer(totalTransfer);
    }

    /// @dev Internal function to create a new Wizard; reverts if the Wizard ID is taken.
    ///      NOTE: This function heavily depends on the internal format of the Wizard struct
    ///      and should always be reassessed if anything about that structure changes.
    /// @param tokenId ID of the new Wizard
    /// @param owner The address that will own the newly conjured Wizard
    /// @param power The power level associated with the new Wizard
    /// @param affinity The elemental affinity of the new Wizard
    function _createWizard(uint256 tokenId, address owner, uint256 power, uint8 affinity) internal {
        require(!_exists(tokenId), "Can't reuse Wizard ID");
        require(owner != address(0), "Owner address must exist");
        require(power > 0, "Wizard power must be non-zero");
        require(power < (1<<88), "Wizard power must fit in 88 bits of storage.");
        require(affinity <= MAX_ELEMENT, "Invalid elemental affinity");

        // Create the Wizard!
        _wizardsById[tokenId] = Wizard(affinity, uint88(power), owner);
        _ownedTokensCount[owner]++;

        // Tell the world!
        emit Transfer(address(0), owner, tokenId);
        emit WizardSummoned(tokenId, affinity, power);
    }

    /// @dev A private utility function that refunds any overpayment to the sender; smart
    ///      enough to only send the excess if the amount we are returning is more than the
    ///      cost of sending it!
    /// @dev Warning! This does not check for underflows (msg.value < actualPrice) - so
    ///      be sure to call this with correct values!
    /// @param actualPrice the actual price owed
    function _transferRefund(uint256 actualPrice) private {
        uint256 refund = msg.value - actualPrice;

        // Make sure the amount we're trying to refund is less than the actual cost of sending it!
        // See https://github.com/ethereum/wiki/wiki/Subtleties for magic values costs.  We can
        // safley ignore the 25000 additional gas cost for new accounts, as msg.sender is
        // guarunteed to exist at this point!
        if (refund > (tx.gasprice * (9000+700))) {
            msg.sender.transfer(refund);
        }
    }

    /// @notice Conjures an Exclusive Wizard with a specific element and ID. This can only be done by
    ///         the Guildmaster, who still has to pay for the power imbued in that Wizard! The power level
    ///         is inferred by the amount of Eth sent. MUST ONLY BE USED FOR EXTERNAL OWNER ADDRESSES.
    /// @param id The ID of the new Wizard; must be in the Exclusive range, and can't already be allocated
    /// @param owner The address which will own the new Wizard
    /// @param affinity The elemental affinity of the new Wizard, can be ELEMENT_NOTSET for Exclusives!
    function conjureExclusiveWizard(uint256 id, address owner, uint8 affinity) public payable onlyGuildmaster {
        require(id > 0 && id <= maxExclusives, "Invalid exclusive ID");
        _createWizard(id, owner, costToPower(msg.value), affinity);
    }

    /// @notice Same as conjureExclusiveWizard(), but reverts if the owner address is a smart
    ///         contract that is not ERC-721 aware.
    /// @param id The ID of the new Wizard; must be in the Exclusive range, and can't already be allocated
    /// @param owner The address which will own the new Wizard
    /// @param affinity The elemental affinity of the new Wizard, can be ELEMENT_NOTSET for Exclusives!
    function safeConjureExclusiveWizard(uint256 id, address owner, uint8 affinity) external payable onlyGuildmaster {
        conjureExclusiveWizard(id, owner, affinity);
        require(_checkOnERC721Received(address(0), owner, id, ""), "must support erc721");
    }

    /// @notice Allows for the batch creation of Exclusive Wizards. Same rules apply as above, but the
    ///         powers are specified instead of being inferred. The message still needs to have enough
    ///         value to pay for all the newly conjured Wizards!  MUST ONLY BE USED FOR EXTERNAL OWNER ADDRESSES.
    /// @param ids An array of IDs of the new Wizards
    /// @param owners An array of owners
    /// @param powers An array of power levels
    /// @param affinities An array of elemental affinities
    function conjureExclusiveWizardMulti(
        uint256[] calldata ids,
        address[] calldata owners,
        uint256[] calldata powers,
        uint8[] calldata affinities) external payable onlyGuildmaster
    {
        // Ensure the arrays are all of the same length
        require(
            ids.length == owners.length &&
            owners.length == powers.length &&
            owners.length == affinities.length,
            "Must have equal array lengths"
        );

        uint256 totalPower = 0;

        for (uint256 i = 0; i < ids.length; i++) {
            require(ids[i] > 0 && ids[i] <= maxExclusives, "Invalid exclusive ID");
            require(affinities[i] <= MAX_ELEMENT, "Must choose a valid elemental affinity");

            _createWizard(ids[i], owners[i], powers[i], affinities[i]);

            totalPower += powers[i];
        }

        // Ensure that the message includes enough eth to cover the total power of all Wizards
        // If this check fails, all the Wizards that we just created will be deleted, and we'll just
        // have wasted a bunch of gas. Don't be dumb, Guildmaster!
        // If the guildMaster has managed to overflow totalPower, well done!
        require(powerToCost(totalPower) <= msg.value, "Must pay for power in all Wizards");

        // We don't return "change" if the caller overpays, because the caller is the Guildmaster and
        // shouldn't be dumb like that. How many times do I have to say it? Don't be dumb, Guildmaster!
    }

    /// @notice Sets the affinity for a Wizard that doesn't already have its elemental affinity chosen.
    ///         Only usable for Exclusive Wizards (all non-Exclusives must have their affinity chosen when
    ///         conjured.) Even Exclusives can't change their affinity once it's been chosen.
    /// @param wizardId The id of the wizard
    /// @param newAffinity The new affinity of the wizard
    function setAffinity(uint256 wizardId, uint8 newAffinity) external {
        require(newAffinity > ELEMENT_NOTSET && newAffinity <= MAX_ELEMENT, "Must choose a valid affinity");
        (address owner, , uint8 affinity) = getWizard(wizardId);
        require(msg.sender == owner, "Affinity can only be set by the owner");
        require(affinity == ELEMENT_NOTSET, "Affinity can only be chosen once");

        _wizardsById[wizardId].affinity = newAffinity;

        // Tell the world this wizards now has an affinity!
        emit WizardAlignmentAssigned(wizardId, newAffinity);
    }

    /// @dev An internal convenience function used by conjureWizard and conjureWizardMulti that takes care
    ///      of the work that is shared between them.
    ///      The use of tempElementalWizardCost and updatedElementalWizardCost deserves some explanation here.
    ///      Using elementalWizardCost directly would be very expensive in the case where this function is
    ///      called repeatedly by conjureWizardMulti. Buying an elemental wizard would update the elementalWizardCost
    ///      each time through this function _which would cost 5000 gas each time_. Of course, we don't actually
    ///      need to store the new value each time, only once at the very end. So we go through this very annoying
    ///      process of passing the elementalWizardCost in as an argument (tempElementalWizardCost) and returning
    ///      the updated value as a return value (updatedElementalWizardCost). It's enough to make one want
    ///      tear one's hair out. But! What's done is done, and hopefully SOMEONE will realize how much trouble
    ///      we went to to save them _just that little bit_ of gas cost when they decided to buy a schwack of
    ///      Wizards.
    function _conjureWizard(
        uint256 wizardId,
        address owner,
        uint8 affinity,
        uint256 tempElementalWizardCost) private
        returns (uint256 wizardCost, uint256 updatedElementalWizardCost)
    {
        // Check for a valid elemental affinity
        require(affinity > ELEMENT_NOTSET && affinity <= MAX_ELEMENT, "Non-exclusive Wizards need a real affinity");

        updatedElementalWizardCost = tempElementalWizardCost;

        // Determine the price
        if (affinity == ELEMENT_NEUTRAL) {
            wizardCost = neutralWizardCost;
        } else {
            wizardCost = updatedElementalWizardCost;

            // Update the elemental Wizard cost
            // NOTE: This math can't overflow because the total Ether supply in wei is well less than
            //       2^128. Multiplying a price in wei by some number <100k can't possibly overflow 256 bits.
            updatedElementalWizardCost += (updatedElementalWizardCost * elementalWizardIncrement) / TENTH_BASIS_POINTS;
        }

        // Bring the new Wizard into existence!
        _createWizard(wizardId, owner, costToPower(wizardCost), affinity);
    }

    /// @notice This is it folks, the main event! The way for the world to get new Wizards! Does
    ///         pretty much what it says on the box: Let's you conjure a new Wizard with a specified
    ///         elemental affinity. The call must include enough eth to cover the cost of the new
    ///         Wizard, and any excess is refunded. The power of the Wizard is derived from
    ///         the sale price. YOU CAN NOT PAY EXTRA TO GET MORE POWER. (But you always have the option
    ///         to conjure some more Wizards!) Returns the ID of the newly conjured Wizard.
    /// @param affinity The elemental affinity you want for your wizard.
    function conjureWizard(uint8 affinity) external payable onlyDuringSale returns (uint256 wizardId) {

        wizardId = nextWizardId;
        nextWizardId++;

        uint256 wizardCost;

        (wizardCost, elementalWizardCost) = _conjureWizard(wizardId, msg.sender, affinity, elementalWizardCost);

        require(msg.value >= wizardCost, "Not enough eth to pay");

         // Refund any overpayment
        _transferRefund(wizardCost);

        // Ensure the Wizard is being assigned to an ERC-721 aware address (either an external address,
        // or a smart contract that implements onERC721Reived())
        require(_checkOnERC721Received(address(0), msg.sender, wizardId, ""), "must support erc721");
    }

    /// @notice A convenience function that allows you to get a whole bunch of Wizards at once! You know how
    ///         there's "a pride of lions", "a murder of crows", and "a parliament of owls"? Well, with this
    ///         here function you can conjure yourself "a stench of Cheeze Wizards"!
    /// @dev This function is careful to bundle all of the external calls (the refund and onERC721Received)
    ///         at the end of the function to limit the risk of reentrancy attacks.
    /// @param affinities the elements of the wizards
    function conjureWizardMulti(uint8[] calldata affinities) external payable onlyDuringSale
            returns (uint256[] memory wizardIds)
    {
        // allocate result array
        wizardIds = new uint256[](affinities.length);

        uint256 totalCost = 0;

        // We take these two storage variables, and turn them into local variables for the course
        // of this loop to save about 10k gas per wizard. It's kind of ugly, but that's a lot of
        // gas! Won't somebody please think of the children!!
        uint256 tempWizardId = nextWizardId;
        uint256 tempElementalWizardCost = elementalWizardCost;

        for (uint256 i = 0; i < affinities.length; i++) {
            wizardIds[i] = tempWizardId;
            tempWizardId++;

            uint256 wizardCost;

            (wizardCost, tempElementalWizardCost) = _conjureWizard(
                wizardIds[i],
                msg.sender,
                affinities[i],
                tempElementalWizardCost);

            totalCost += wizardCost;
        }

        elementalWizardCost = tempElementalWizardCost;
        nextWizardId = tempWizardId;

        // check to see if there's enough eth
        require(msg.value >= totalCost, "Not enough eth to pay");

        // Ensure the Wizard is being assigned to an ERC-721 aware address (either an external address,
        // or a smart contract that implements onERC721Received()). We unwind the logic of _checkOnERC721Received
        // because called address.isContract() every time through this loop can get reasonably expensive. We do
        // need to call this function for each token created, however, because it's allowed for an ERC-721 receiving
        // contract to reject the transfer based on the properties of the token.
        if (isContract(msg.sender)) {
            for (uint256 i = 0; i < wizardIds.length; i++) {
                bytes4 retval = IERC721Receiver(msg.sender).onERC721Received(msg.sender, address(0), wizardIds[i], "");
                require(retval == _ERC721_RECEIVED, "Contract owner didn't accept ERC-721 transfer");
            }
        }

        // Refund any excess funds
        _transferRefund(totalCost);
    }

    /// @dev Transfers the current balance to the owner and terminates the contract.
    function destroy() external onlyGuildmaster {
        selfdestruct(guildmaster);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"elementalWizardIncrement","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleDuration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"ids","type":"uint256[]"}],"name":"absorbWizardMulti","outputs":[{"name":"owners","type":"address[]"},{"name":"powers","type":"uint256[]"},{"name":"affinities","type":"uint8[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"power","type":"uint256"}],"name":"powerToCost","outputs":[{"name":"cost","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newStart","type":"uint128"}],"name":"postponeSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"affinity","type":"uint8"}],"name":"conjureWizard","outputs":[{"name":"wizardId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_wizardsById","outputs":[{"name":"affinity","type":"uint8"},{"name":"power","type":"uint88"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDuringSale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"owner","type":"address"},{"name":"affinity","type":"uint8"}],"name":"conjureExclusiveWizard","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"guildmaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"neutralWizardCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_INTERFACE_ID_WIZARDPRESALE","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wizardId","type":"uint256"},{"name":"newAffinity","type":"uint8"}],"name":"setAffinity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxExclusives","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gatekeeper","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"absorbWizard","outputs":[{"name":"owner","type":"address"},{"name":"power","type":"uint256"},{"name":"affinity","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"affinities","type":"uint8[]"}],"name":"conjureWizardMulti","outputs":[{"name":"wizardIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"nextWizardId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"cost","type":"uint256"}],"name":"costToPower","outputs":[{"name":"power","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"elementalWizardCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"owner","type":"address"},{"name":"affinity","type":"uint8"}],"name":"safeConjureExclusiveWizard","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getWizard","outputs":[{"name":"owner","type":"address"},{"name":"power","type":"uint88"},{"name":"affinity","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"gc","type":"address"}],"name":"setGatekeeper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"ids","type":"uint256[]"},{"name":"owners","type":"address[]"},{"name":"powers","type":"uint256[]"},{"name":"affinities","type":"uint8[]"}],"name":"conjureExclusiveWizardMulti","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"startingCost","type":"uint128"},{"name":"costIncremement","type":"uint16"},{"name":"exclusiveCount","type":"uint256"},{"name":"startBlock","type":"uint128"},{"name":"duration","type":"uint128"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldStartBlock","type":"uint256"},{"indexed":false,"name":"newStartBlock","type":"uint256"}],"name":"StartBlockChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"element","type":"uint8"},{"indexed":false,"name":"power","type":"uint256"}],"name":"WizardSummoned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"element","type":"uint8"}],"name":"WizardAlignmentAssigned","type":"event"}]

60806040523480156200001157600080fd5b5060405160a08062002f0f833981018060405260a08110156200003357600080fd5b5080516020808301516040840151606085015160809095015193949193909262000083907f01ffc9a700000000000000000000000000000000000000000000000000000000906200017f811b901c565b6200009b6380ac58cd60e01b6200017f60201b60201c565b43826001600160801b031611620000fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018062002ee76028913960400191505060405180910390fd5b600580546001600160a01b031916331790556001600160801b038083166006558181166007558516600881905560095561ffff8416600a55600b83905560018301600c55620001747f4df71efb000000000000000000000000000000000000000000000000000000006200017f602090811b901c565b5050505050620001ec565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620001af57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b612ceb80620001fc6000396000f3fe60806040526004361061020f5760003560e01c806383197ef011610118578063ce6991fd116100a0578063ec8cd3ce1161006f578063ec8cd3ce146109f5578063f1cb560614610a0a578063fac8eafc14610a3f578063fbb9795614610a9c578063ffc0b9ad14610acf5761020f565b8063ce6991fd146108bd578063dc9f1cdd1461097b578063e5a604bf14610990578063e985e9c5146109ba5761020f565b80639b025025116100e75780639b02502514610732578063a22cb46514610747578063a59c9c2714610782578063a7847c3a14610797578063b88d4fde146107ec5761020f565b806383197ef0146106a35780638be7310c146106b85780638ef0da6f146106cd57806398d7a414146106ff5761020f565b806348b92c201161019b57806363f3ce311161016a57806363f3ce31146105b45780636de9b6d81461061157806370a0823114610626578063795cfa9b146106595780637f7ca38e1461068e5761020f565b806348b92c201461050d578063565ca6dd14610537578063573f322f1461056a5780636352211e1461058a5761020f565b806323b872dd116101e257806323b872dd146103045780632447aee9146103475780633711d9fb1461035c57806342842e0e14610371578063476c4a5e146103b45761020f565b806301ffc9a714610214578063081812fc1461025c578063095ea7b3146102a257806320027275146102dd575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610c2d565b604080519115158252519081900360200190f35b34801561026857600080fd5b506102866004803603602081101561027f57600080fd5b5035610c4c565b604080516001600160a01b039092168252519081900360200190f35b3480156102ae57600080fd5b506102db600480360360408110156102c557600080fd5b506001600160a01b038135169060200135610cb1565b005b3480156102e957600080fd5b506102f2610dc8565b60408051918252519081900360200190f35b34801561031057600080fd5b506102db6004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b34801561035357600080fd5b506102f2610e26565b34801561036857600080fd5b506102f2610e2c565b34801561037d57600080fd5b506102db6004803603606081101561039457600080fd5b506001600160a01b03813581169160208101359091169060400135610e32565b3480156103c057600080fd5b5061042f600480360360208110156103d757600080fd5b810190602081018135600160201b8111156103f157600080fd5b82018360208201111561040357600080fd5b803590602001918460208302840111600160201b8311171561042457600080fd5b509092509050610e4d565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561047757818101518382015260200161045f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156104b657818101518382015260200161049e565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156104f55781810151838201526020016104dd565b50505050905001965050505050505060405180910390f35b34801561051957600080fd5b506102f26004803603602081101561053057600080fd5b5035611055565b34801561054357600080fd5b506102db6004803603602081101561055a57600080fd5b50356001600160801b031661105c565b6102f26004803603602081101561058057600080fd5b503560ff1661118e565b34801561059657600080fd5b50610286600480360360208110156105ad57600080fd5b503561132c565b3480156105c057600080fd5b506105de600480360360208110156105d757600080fd5b5035611390565b6040805160ff90941684526001600160581b0390921660208401526001600160a01b031682820152519081900360600190f35b34801561061d57600080fd5b506102486113c6565b34801561063257600080fd5b506102f26004803603602081101561064957600080fd5b50356001600160a01b03166113e4565b6102db6004803603606081101561066f57600080fd5b5080359060208101356001600160a01b0316906040013560ff1661144a565b34801561069a57600080fd5b50610286611514565b3480156106af57600080fd5b506102db611523565b3480156106c457600080fd5b506102f2611581565b3480156106d957600080fd5b506106e2611587565b604080516001600160e01b03199092168252519081900360200190f35b34801561070b57600080fd5b506102db6004803603604081101561072257600080fd5b508035906020013560ff16611595565b34801561073e57600080fd5b506102f2611716565b34801561075357600080fd5b506102db6004803603604081101561076a57600080fd5b506001600160a01b038135169060200135151561171c565b34801561078e57600080fd5b506102866117eb565b3480156107a357600080fd5b506107c1600480360360208110156107ba57600080fd5b50356117fa565b604080516001600160a01b039094168452602084019290925260ff1682820152519081900360600190f35b3480156107f857600080fd5b506102db6004803603608081101561080f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118bb945050505050565b61092b600480360360208110156108d357600080fd5b810190602081018135600160201b8111156108ed57600080fd5b8201836020820111156108ff57600080fd5b803590602001918460208302840111600160201b8311171561092057600080fd5b509092509050611916565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561096757818101518382015260200161094f565b505050509050019250505060405180910390f35b34801561098757600080fd5b506102f2611c1d565b34801561099c57600080fd5b506102f2600480360360208110156109b357600080fd5b5035611c23565b3480156109c657600080fd5b50610248600480360360408110156109dd57600080fd5b506001600160a01b0381358116916020013516611c2b565b348015610a0157600080fd5b506102f2611c59565b6102db60048036036060811015610a2057600080fd5b5080359060208101356001600160a01b0316906040013560ff16611c5f565b348015610a4b57600080fd5b50610a6960048036036020811015610a6257600080fd5b5035611d2a565b604080516001600160a01b0390941684526001600160581b03909216602084015260ff1682820152519081900360600190f35b348015610aa857600080fd5b506102db60048036036020811015610abf57600080fd5b50356001600160a01b0316611de3565b6102db60048036036080811015610ae557600080fd5b810190602081018135600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919390929091602081019035600160201b811115610b4f57600080fd5b820183602082011115610b6157600080fd5b803590602001918460208302840111600160201b83111715610b8257600080fd5b919390929091602081019035600160201b811115610b9f57600080fd5b820183602082011115610bb157600080fd5b803590602001918460208302840111600160201b83111715610bd257600080fd5b919390929091602081019035600160201b811115610bef57600080fd5b820183602082011115610c0157600080fd5b803590602001918460208302840111600160201b83111715610c2257600080fd5b509092509050611eb4565b6001600160e01b03191660009081526020819052604090205460ff1690565b6000610c578261213a565b610c9557604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612b06602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610cbc8261132c565b9050806001600160a01b0316836001600160a01b03161415610d1257604051600160e51b62461bcd028152600401808060200182810382526021815260200180612b5b6021913960400191505060405180910390fd5b336001600160a01b0382161480610d2e5750610d2e8133611c2b565b610d6c57604051600160e51b62461bcd028152600401808060200182810382526038815260200180612a7b6038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60065481565b610dd8338261215e565b610e1657604051600160e51b62461bcd028152600401808060200182810382526031815260200180612b7c6031913960400191505060405180910390fd5b610e21838383612205565b505050565b600a5481565b60075481565b610e21838383604051806020016040528060008152506118bb565b600d54606090819081906001600160a01b03163314610eae5760408051600160e51b62461bcd0281526020600482015260126024820152600160711b7126bab9ba1031329033b0ba32b5b2b2b832b902604482015290519081900360640190fd5b604080518581526020808702820101909152848015610ed7578160200160208202803883390190505b50604080518681526020808802820101909152909350848015610f04578160200160208202803883390190505b50604080518681526020808802820101909152909250848015610f31578160200160208202803883390190505b5090506000805b8581101561101e57610f5b878783818110610f4f57fe5b90506020020135611d2a565b816001600160581b03169150878481518110610f7357fe5b60200260200101878581518110610f8657fe5b60200260200101878681518110610f9957fe5b602002602001018360ff1660ff1681525083815250836001600160a01b03166001600160a01b0316815250505050610ff6858281518110610fd657fe5b6020026020010151888884818110610fea57fe5b90506020020135612339565b61101284828151811061100557fe5b6020026020010151611055565b90910190600101610f38565b50604051339082156108fc029083906000818181858888f1935050505015801561104c573d6000803e3d6000fd5b50509250925092565b6103e80290565b6005546001600160a01b031633146110ac5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b60065443106110ef57604051600160e51b62461bcd02815260040180806020018281038252603a815260200180612c60603a913960400191505060405180910390fd5b600654816001600160801b03161161113b57604051600160e51b62461bcd028152600401808060200182810382526035815260200180612bad6035913960400191505060405180910390fd5b600654604080519182526001600160801b038316602083015280517f8774aa9221f02a7971c04902013456be92b6a521a2347a44ec6610e4b9a5d8fc9281900390910190a16001600160801b0316600655565b60006006544310156111e15760408051600160e51b62461bcd02815260206004820152601160248201526001607a1b7014d85b19481b9bdd081bdc195b881e595d02604482015290519081900360640190fd5b60075460065401431061122f5760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a14d85b194818db1bdcd95902604482015290519081900360640190fd5b50600c805460018101909155600954600090611250908390339086906123fb565b6009559050348111156112ad5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f7567682065746820746f207061790000000000000000000000604482015290519081900360640190fd5b6112b68161249d565b6112d260003384604051806020016040528060008152506124de565b6113265760408051600160e51b62461bcd02815260206004820152601360248201527f6d75737420737570706f72742065726337323100000000000000000000000000604482015290519081900360640190fd5b50919050565b600081815260016020526040812054600160601b90046001600160a01b03168061138a57604051600160e51b62461bcd028152600401808060200182810382526029815260200180612add6029913960400191505060405180910390fd5b92915050565b60016020526000908152604090205460ff81169061010081046001600160581b031690600160601b90046001600160a01b031683565b600060065443101580156113df57506007546006540143105b905090565b60006001600160a01b03821661142e57604051600160e51b62461bcd02815260040180806020018281038252602a815260200180612ab3602a913960400191505060405180910390fd5b506001600160a01b031660009081526003602052604090205490565b6005546001600160a01b0316331461149a5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b6000831180156114ac5750600b548311155b6115005760408051600160e51b62461bcd02815260206004820152601460248201527f496e76616c6964206578636c7573697665204944000000000000000000000000604482015290519081900360640190fd5b610e21838361150e34611c23565b84612617565b6005546001600160a01b031681565b6005546001600160a01b031633146115735760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b6005546001600160a01b0316ff5b60085481565b600160e01b634df71efb0281565b60ff8116158015906115ab5750600460ff821611155b6115ff5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60008061160b84611d2a565b9250509150816001600160a01b0316336001600160a01b03161461166357604051600160e51b62461bcd028152600401808060200182810382526025815260200180612a566025913960400191505060405180910390fd5b60ff8116156116bc5760408051600160e51b62461bcd02815260206004820181905260248201527f416666696e6974792063616e206f6e6c792062652063686f73656e206f6e6365604482015290519081900360640190fd5b600084815260016020908152604091829020805460ff191660ff87169081179091558251908152915186927f0f0bc6913c78f45e890c2265a362fd955a202a954142552907cb83e4ef9f409a92908290030190a250505050565b600b5481565b6001600160a01b03821633141561177d5760408051600160e51b62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600d546001600160a01b031681565b600d54600090819081906001600160a01b0316331461185b5760408051600160e51b62461bcd0281526020600482015260126024820152600160711b7126bab9ba1031329033b0ba32b5b2b2b832b902604482015290519081900360640190fd5b61186484611d2a565b9194506001600160581b03169250905061187e8385612339565b336108fc61188b84611055565b6040518115909202916000818181858888f193505050501580156118b3573d6000803e3d6000fd5b509193909250565b6118c6848484610dce565b6118d2848484846124de565b61191057604051600160e51b62461bcd0281526004018080602001828103825260328152602001806129436032913960400191505060405180910390fd5b50505050565b60606006544310156119695760408051600160e51b62461bcd02815260206004820152601160248201526001607a1b7014d85b19481b9bdd081bdc195b881e595d02604482015290519081900360640190fd5b6007546006540143106119b75760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a14d85b194818db1bdcd95902604482015290519081900360640190fd5b6040805183815260208085028201019091528280156119e0578160200160208202803883390190505b50600c54600954919250600091825b85811015611a5c5782858281518110611a0457fe5b60200260200101818152505082806001019350506000611a4e868381518110611a2957fe5b6020026020010151338a8a86818110611a3e57fe5b9050602002013560ff16866123fb565b9501949250506001016119ef565b506009819055600c82905534831115611abf5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f7567682065746820746f207061790000000000000000000000604482015290519081900360640190fd5b611ac8336128df565b15611c0b5760005b8451811015611c09576000336001600160a01b031663150b7a02336000898681518110611af957fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611b7d57600080fd5b505af1158015611b91573d6000803e3d6000fd5b505050506040513d6020811015611ba757600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611c0057604051600160e51b62461bcd02815260040180806020018281038252602d815260200180612c07602d913960400191505060405180910390fd5b50600101611ad0565b505b611c148361249d565b50505092915050565b600c5481565b6103e8900490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60095481565b6005546001600160a01b03163314611caf5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b611cba83838361144a565b611cd660008385604051806020016040528060008152506124de565b610e215760408051600160e51b62461bcd02815260206004820152601360248201527f6d75737420737570706f72742065726337323100000000000000000000000000604482015290519081900360640190fd5b6000806000611d37612922565b5050506000828152600160209081526040918290208251606081018452905460ff811680835261010082046001600160581b0316938301849052600160601b9091046001600160a01b0316938201849052929350909190836118b35760408051600160e51b62461bcd02815260206004820152601560248201527f57697a61726420646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b6005546001600160a01b03163314611e335760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b600d546001600160a01b0316158015611e5457506001600160a01b03811615155b611e9257604051600160e51b62461bcd028152600401808060200182810382526026815260200180612c9a6026913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f045760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b8685148015611f1257508483145b8015611f1d57508481145b611f715760408051600160e51b62461bcd02815260206004820152601d60248201527f4d757374206861766520657175616c206172726179206c656e67746873000000604482015290519081900360640190fd5b6000805b888110156120e45760008a8a83818110611f8b57fe5b90506020020135118015611fb35750600b548a8a83818110611fa957fe5b9050602002013511155b6120075760408051600160e51b62461bcd02815260206004820152601460248201527f496e76616c6964206578636c7573697665204944000000000000000000000000604482015290519081900360640190fd5b600484848381811061201557fe5b9050602002013560ff1660ff16111561206257604051600160e51b62461bcd0281526004018080602001828103825260268152602001806129956026913960400191505060405180910390fd5b6120c28a8a8381811061207157fe5b9050602002013589898481811061208457fe5b905060200201356001600160a01b03168888858181106120a057fe5b905060200201358787868181106120b357fe5b9050602002013560ff16612617565b8585828181106120ce57fe5b6020029190910135929092019150600101611f75565b50346120ef82611055565b111561212f57604051600160e51b62461bcd028152600401808060200182810382526021815260200180612a356021913960400191505060405180910390fd5b505050505050505050565b600090815260016020526040902054600160601b90046001600160a01b0316151590565b60006121698261213a565b6121a757604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612a09602c913960400191505060405180910390fd5b60006121b28361132c565b9050806001600160a01b0316846001600160a01b031614806121ed5750836001600160a01b03166121e284610c4c565b6001600160a01b0316145b806121fd57506121fd8185611c2b565b949350505050565b826001600160a01b03166122188261132c565b6001600160a01b03161461226057604051600160e51b62461bcd028152600401808060200182810382526029815260200180612b326029913960400191505060405180910390fd5b6001600160a01b0382166122a857604051600160e51b62461bcd0281526004018080602001828103825260248152602001806129e56024913960400191505060405180910390fd5b6122b1816128e5565b6001600160a01b03838116600081815260036020908152604080832080546000190190559386168083528483208054600190810190915586845290915283822080546bffffffffffffffffffffffff16600160601b83021790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b031661234c8261132c565b6001600160a01b03161461239457604051600160e51b62461bcd028152600401808060200182810382526025815260200180612be26025913960400191505060405180910390fd5b61239d816128e5565b6001600160a01b038216600081815260036020908152604080832080546000190190558483526001909152808220829055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008060ff8416158015906124145750600460ff851611155b61245257604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806129bb602a913960400191505060405180910390fd5b508160ff84166001141561246a576008549150612480565b809150620186a0600a5482028161247d57fe5b04015b612494868661248e85611c23565b87612617565b94509492505050565b348190036125e43a028111156124da57604051339082156108fc029083906000818181858888f19350505050158015610e21573d6000803e3d6000fd5b5050565b60006124f2846001600160a01b03166128df565b6124fe575060016121fd565b604051600160e11b630a85bd0102815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561257b578181015183820152602001612563565b50505050905090810190601f1680156125a85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d60208110156125f457600080fd5b50516001600160e01b031916600160e11b630a85bd010214915050949350505050565b6126208461213a565b156126755760408051600160e51b62461bcd02815260206004820152601560248201527f43616e27742072657573652057697a6172642049440000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166126d35760408051600160e51b62461bcd02815260206004820152601860248201527f4f776e65722061646472657373206d7573742065786973740000000000000000604482015290519081900360640190fd5b6000821161272b5760408051600160e51b62461bcd02815260206004820152601d60248201527f57697a61726420706f776572206d757374206265206e6f6e2d7a65726f000000604482015290519081900360640190fd5b600160581b821061277057604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612c34602c913960400191505060405180910390fd5b600460ff821611156127cc5760408051600160e51b62461bcd02815260206004820152601a60248201527f496e76616c696420656c656d656e74616c20616666696e697479000000000000604482015290519081900360640190fd5b6040805160608101825260ff83811682526001600160581b0385811660208085019182526001600160a01b0389811686880181815260008d815260018086528a822099518a549751935160ff199098169916989098176bffffffffffffffffffffff0019166101009290971691909102959095176bffffffffffffffffffffffff16600160601b9490921693909302179094558082526003909352838120805490920190915591518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46040805160ff8316815260208101849052815186927f7c0fbd69c04ea8ef6f62724eebd9c311d984e86457a801d81c0cb52ec9039170928290030190a250505050565b3b151590565b6000818152600260205260409020546001600160a01b03161561291f57600081815260026020526040902080546001600160a01b03191690555b50565b60408051606081018252600080825260208201819052918101919091529056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724d757374206265206775696c646d6173746572000000000000000000000000004d7573742063686f6f736520612076616c696420656c656d656e74616c20616666696e6974794e6f6e2d6578636c75736976652057697a61726473206e6565642061207265616c20616666696e6974794552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d7573742070617920666f7220706f77657220696e20616c6c2057697a61726473416666696e6974792063616e206f6e6c792062652073657420627920746865206f776e65724552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644e65772073746172742074696d65206d757374206265206c61746572207468616e2070726576696f75732073746172742074696d654552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e436f6e7472616374206f776e6572206469646e277420616363657074204552432d373231207472616e7366657257697a61726420706f776572206d7573742066697420696e2038382062697473206f662073746f726167652e53616c652073746172742074696d65206f6e6c792061646a75737461626c65206265666f72652070726576696f75732073746172742074696d6543616e206f6e6c7920736574206f6e636520616e64206d757374206e6f74206265207a65726fa165627a7a723058200beadfe2372f5675c3aa5a195c6ba093f30c9613b11b8d9d2864314aceff2d5500297374617274206d7573742062652067726561746572207468616e2063757272656e7420626c6f636b00000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000004d2000000000000000000000000000000000000000000000000000000000076b6b0000000000000000000000000000000000000000000000000000000000000b9ff

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806383197ef011610118578063ce6991fd116100a0578063ec8cd3ce1161006f578063ec8cd3ce146109f5578063f1cb560614610a0a578063fac8eafc14610a3f578063fbb9795614610a9c578063ffc0b9ad14610acf5761020f565b8063ce6991fd146108bd578063dc9f1cdd1461097b578063e5a604bf14610990578063e985e9c5146109ba5761020f565b80639b025025116100e75780639b02502514610732578063a22cb46514610747578063a59c9c2714610782578063a7847c3a14610797578063b88d4fde146107ec5761020f565b806383197ef0146106a35780638be7310c146106b85780638ef0da6f146106cd57806398d7a414146106ff5761020f565b806348b92c201161019b57806363f3ce311161016a57806363f3ce31146105b45780636de9b6d81461061157806370a0823114610626578063795cfa9b146106595780637f7ca38e1461068e5761020f565b806348b92c201461050d578063565ca6dd14610537578063573f322f1461056a5780636352211e1461058a5761020f565b806323b872dd116101e257806323b872dd146103045780632447aee9146103475780633711d9fb1461035c57806342842e0e14610371578063476c4a5e146103b45761020f565b806301ffc9a714610214578063081812fc1461025c578063095ea7b3146102a257806320027275146102dd575b600080fd5b34801561022057600080fd5b506102486004803603602081101561023757600080fd5b50356001600160e01b031916610c2d565b604080519115158252519081900360200190f35b34801561026857600080fd5b506102866004803603602081101561027f57600080fd5b5035610c4c565b604080516001600160a01b039092168252519081900360200190f35b3480156102ae57600080fd5b506102db600480360360408110156102c557600080fd5b506001600160a01b038135169060200135610cb1565b005b3480156102e957600080fd5b506102f2610dc8565b60408051918252519081900360200190f35b34801561031057600080fd5b506102db6004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b34801561035357600080fd5b506102f2610e26565b34801561036857600080fd5b506102f2610e2c565b34801561037d57600080fd5b506102db6004803603606081101561039457600080fd5b506001600160a01b03813581169160208101359091169060400135610e32565b3480156103c057600080fd5b5061042f600480360360208110156103d757600080fd5b810190602081018135600160201b8111156103f157600080fd5b82018360208201111561040357600080fd5b803590602001918460208302840111600160201b8311171561042457600080fd5b509092509050610e4d565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561047757818101518382015260200161045f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156104b657818101518382015260200161049e565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156104f55781810151838201526020016104dd565b50505050905001965050505050505060405180910390f35b34801561051957600080fd5b506102f26004803603602081101561053057600080fd5b5035611055565b34801561054357600080fd5b506102db6004803603602081101561055a57600080fd5b50356001600160801b031661105c565b6102f26004803603602081101561058057600080fd5b503560ff1661118e565b34801561059657600080fd5b50610286600480360360208110156105ad57600080fd5b503561132c565b3480156105c057600080fd5b506105de600480360360208110156105d757600080fd5b5035611390565b6040805160ff90941684526001600160581b0390921660208401526001600160a01b031682820152519081900360600190f35b34801561061d57600080fd5b506102486113c6565b34801561063257600080fd5b506102f26004803603602081101561064957600080fd5b50356001600160a01b03166113e4565b6102db6004803603606081101561066f57600080fd5b5080359060208101356001600160a01b0316906040013560ff1661144a565b34801561069a57600080fd5b50610286611514565b3480156106af57600080fd5b506102db611523565b3480156106c457600080fd5b506102f2611581565b3480156106d957600080fd5b506106e2611587565b604080516001600160e01b03199092168252519081900360200190f35b34801561070b57600080fd5b506102db6004803603604081101561072257600080fd5b508035906020013560ff16611595565b34801561073e57600080fd5b506102f2611716565b34801561075357600080fd5b506102db6004803603604081101561076a57600080fd5b506001600160a01b038135169060200135151561171c565b34801561078e57600080fd5b506102866117eb565b3480156107a357600080fd5b506107c1600480360360208110156107ba57600080fd5b50356117fa565b604080516001600160a01b039094168452602084019290925260ff1682820152519081900360600190f35b3480156107f857600080fd5b506102db6004803603608081101561080f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118bb945050505050565b61092b600480360360208110156108d357600080fd5b810190602081018135600160201b8111156108ed57600080fd5b8201836020820111156108ff57600080fd5b803590602001918460208302840111600160201b8311171561092057600080fd5b509092509050611916565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561096757818101518382015260200161094f565b505050509050019250505060405180910390f35b34801561098757600080fd5b506102f2611c1d565b34801561099c57600080fd5b506102f2600480360360208110156109b357600080fd5b5035611c23565b3480156109c657600080fd5b50610248600480360360408110156109dd57600080fd5b506001600160a01b0381358116916020013516611c2b565b348015610a0157600080fd5b506102f2611c59565b6102db60048036036060811015610a2057600080fd5b5080359060208101356001600160a01b0316906040013560ff16611c5f565b348015610a4b57600080fd5b50610a6960048036036020811015610a6257600080fd5b5035611d2a565b604080516001600160a01b0390941684526001600160581b03909216602084015260ff1682820152519081900360600190f35b348015610aa857600080fd5b506102db60048036036020811015610abf57600080fd5b50356001600160a01b0316611de3565b6102db60048036036080811015610ae557600080fd5b810190602081018135600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919390929091602081019035600160201b811115610b4f57600080fd5b820183602082011115610b6157600080fd5b803590602001918460208302840111600160201b83111715610b8257600080fd5b919390929091602081019035600160201b811115610b9f57600080fd5b820183602082011115610bb157600080fd5b803590602001918460208302840111600160201b83111715610bd257600080fd5b919390929091602081019035600160201b811115610bef57600080fd5b820183602082011115610c0157600080fd5b803590602001918460208302840111600160201b83111715610c2257600080fd5b509092509050611eb4565b6001600160e01b03191660009081526020819052604090205460ff1690565b6000610c578261213a565b610c9557604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612b06602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610cbc8261132c565b9050806001600160a01b0316836001600160a01b03161415610d1257604051600160e51b62461bcd028152600401808060200182810382526021815260200180612b5b6021913960400191505060405180910390fd5b336001600160a01b0382161480610d2e5750610d2e8133611c2b565b610d6c57604051600160e51b62461bcd028152600401808060200182810382526038815260200180612a7b6038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60065481565b610dd8338261215e565b610e1657604051600160e51b62461bcd028152600401808060200182810382526031815260200180612b7c6031913960400191505060405180910390fd5b610e21838383612205565b505050565b600a5481565b60075481565b610e21838383604051806020016040528060008152506118bb565b600d54606090819081906001600160a01b03163314610eae5760408051600160e51b62461bcd0281526020600482015260126024820152600160711b7126bab9ba1031329033b0ba32b5b2b2b832b902604482015290519081900360640190fd5b604080518581526020808702820101909152848015610ed7578160200160208202803883390190505b50604080518681526020808802820101909152909350848015610f04578160200160208202803883390190505b50604080518681526020808802820101909152909250848015610f31578160200160208202803883390190505b5090506000805b8581101561101e57610f5b878783818110610f4f57fe5b90506020020135611d2a565b816001600160581b03169150878481518110610f7357fe5b60200260200101878581518110610f8657fe5b60200260200101878681518110610f9957fe5b602002602001018360ff1660ff1681525083815250836001600160a01b03166001600160a01b0316815250505050610ff6858281518110610fd657fe5b6020026020010151888884818110610fea57fe5b90506020020135612339565b61101284828151811061100557fe5b6020026020010151611055565b90910190600101610f38565b50604051339082156108fc029083906000818181858888f1935050505015801561104c573d6000803e3d6000fd5b50509250925092565b6103e80290565b6005546001600160a01b031633146110ac5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b60065443106110ef57604051600160e51b62461bcd02815260040180806020018281038252603a815260200180612c60603a913960400191505060405180910390fd5b600654816001600160801b03161161113b57604051600160e51b62461bcd028152600401808060200182810382526035815260200180612bad6035913960400191505060405180910390fd5b600654604080519182526001600160801b038316602083015280517f8774aa9221f02a7971c04902013456be92b6a521a2347a44ec6610e4b9a5d8fc9281900390910190a16001600160801b0316600655565b60006006544310156111e15760408051600160e51b62461bcd02815260206004820152601160248201526001607a1b7014d85b19481b9bdd081bdc195b881e595d02604482015290519081900360640190fd5b60075460065401431061122f5760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a14d85b194818db1bdcd95902604482015290519081900360640190fd5b50600c805460018101909155600954600090611250908390339086906123fb565b6009559050348111156112ad5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f7567682065746820746f207061790000000000000000000000604482015290519081900360640190fd5b6112b68161249d565b6112d260003384604051806020016040528060008152506124de565b6113265760408051600160e51b62461bcd02815260206004820152601360248201527f6d75737420737570706f72742065726337323100000000000000000000000000604482015290519081900360640190fd5b50919050565b600081815260016020526040812054600160601b90046001600160a01b03168061138a57604051600160e51b62461bcd028152600401808060200182810382526029815260200180612add6029913960400191505060405180910390fd5b92915050565b60016020526000908152604090205460ff81169061010081046001600160581b031690600160601b90046001600160a01b031683565b600060065443101580156113df57506007546006540143105b905090565b60006001600160a01b03821661142e57604051600160e51b62461bcd02815260040180806020018281038252602a815260200180612ab3602a913960400191505060405180910390fd5b506001600160a01b031660009081526003602052604090205490565b6005546001600160a01b0316331461149a5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b6000831180156114ac5750600b548311155b6115005760408051600160e51b62461bcd02815260206004820152601460248201527f496e76616c6964206578636c7573697665204944000000000000000000000000604482015290519081900360640190fd5b610e21838361150e34611c23565b84612617565b6005546001600160a01b031681565b6005546001600160a01b031633146115735760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b6005546001600160a01b0316ff5b60085481565b600160e01b634df71efb0281565b60ff8116158015906115ab5750600460ff821611155b6115ff5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60008061160b84611d2a565b9250509150816001600160a01b0316336001600160a01b03161461166357604051600160e51b62461bcd028152600401808060200182810382526025815260200180612a566025913960400191505060405180910390fd5b60ff8116156116bc5760408051600160e51b62461bcd02815260206004820181905260248201527f416666696e6974792063616e206f6e6c792062652063686f73656e206f6e6365604482015290519081900360640190fd5b600084815260016020908152604091829020805460ff191660ff87169081179091558251908152915186927f0f0bc6913c78f45e890c2265a362fd955a202a954142552907cb83e4ef9f409a92908290030190a250505050565b600b5481565b6001600160a01b03821633141561177d5760408051600160e51b62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600d546001600160a01b031681565b600d54600090819081906001600160a01b0316331461185b5760408051600160e51b62461bcd0281526020600482015260126024820152600160711b7126bab9ba1031329033b0ba32b5b2b2b832b902604482015290519081900360640190fd5b61186484611d2a565b9194506001600160581b03169250905061187e8385612339565b336108fc61188b84611055565b6040518115909202916000818181858888f193505050501580156118b3573d6000803e3d6000fd5b509193909250565b6118c6848484610dce565b6118d2848484846124de565b61191057604051600160e51b62461bcd0281526004018080602001828103825260328152602001806129436032913960400191505060405180910390fd5b50505050565b60606006544310156119695760408051600160e51b62461bcd02815260206004820152601160248201526001607a1b7014d85b19481b9bdd081bdc195b881e595d02604482015290519081900360640190fd5b6007546006540143106119b75760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a14d85b194818db1bdcd95902604482015290519081900360640190fd5b6040805183815260208085028201019091528280156119e0578160200160208202803883390190505b50600c54600954919250600091825b85811015611a5c5782858281518110611a0457fe5b60200260200101818152505082806001019350506000611a4e868381518110611a2957fe5b6020026020010151338a8a86818110611a3e57fe5b9050602002013560ff16866123fb565b9501949250506001016119ef565b506009819055600c82905534831115611abf5760408051600160e51b62461bcd02815260206004820152601560248201527f4e6f7420656e6f7567682065746820746f207061790000000000000000000000604482015290519081900360640190fd5b611ac8336128df565b15611c0b5760005b8451811015611c09576000336001600160a01b031663150b7a02336000898681518110611af957fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611b7d57600080fd5b505af1158015611b91573d6000803e3d6000fd5b505050506040513d6020811015611ba757600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611c0057604051600160e51b62461bcd02815260040180806020018281038252602d815260200180612c07602d913960400191505060405180910390fd5b50600101611ad0565b505b611c148361249d565b50505092915050565b600c5481565b6103e8900490565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60095481565b6005546001600160a01b03163314611caf5760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b611cba83838361144a565b611cd660008385604051806020016040528060008152506124de565b610e215760408051600160e51b62461bcd02815260206004820152601360248201527f6d75737420737570706f72742065726337323100000000000000000000000000604482015290519081900360640190fd5b6000806000611d37612922565b5050506000828152600160209081526040918290208251606081018452905460ff811680835261010082046001600160581b0316938301849052600160601b9091046001600160a01b0316938201849052929350909190836118b35760408051600160e51b62461bcd02815260206004820152601560248201527f57697a61726420646f6573206e6f742065786973740000000000000000000000604482015290519081900360640190fd5b6005546001600160a01b03163314611e335760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b600d546001600160a01b0316158015611e5457506001600160a01b03811615155b611e9257604051600160e51b62461bcd028152600401808060200182810382526026815260200180612c9a6026913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f045760408051600160e51b62461bcd0281526020600482015260136024820152600080516020612975833981519152604482015290519081900360640190fd5b8685148015611f1257508483145b8015611f1d57508481145b611f715760408051600160e51b62461bcd02815260206004820152601d60248201527f4d757374206861766520657175616c206172726179206c656e67746873000000604482015290519081900360640190fd5b6000805b888110156120e45760008a8a83818110611f8b57fe5b90506020020135118015611fb35750600b548a8a83818110611fa957fe5b9050602002013511155b6120075760408051600160e51b62461bcd02815260206004820152601460248201527f496e76616c6964206578636c7573697665204944000000000000000000000000604482015290519081900360640190fd5b600484848381811061201557fe5b9050602002013560ff1660ff16111561206257604051600160e51b62461bcd0281526004018080602001828103825260268152602001806129956026913960400191505060405180910390fd5b6120c28a8a8381811061207157fe5b9050602002013589898481811061208457fe5b905060200201356001600160a01b03168888858181106120a057fe5b905060200201358787868181106120b357fe5b9050602002013560ff16612617565b8585828181106120ce57fe5b6020029190910135929092019150600101611f75565b50346120ef82611055565b111561212f57604051600160e51b62461bcd028152600401808060200182810382526021815260200180612a356021913960400191505060405180910390fd5b505050505050505050565b600090815260016020526040902054600160601b90046001600160a01b0316151590565b60006121698261213a565b6121a757604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612a09602c913960400191505060405180910390fd5b60006121b28361132c565b9050806001600160a01b0316846001600160a01b031614806121ed5750836001600160a01b03166121e284610c4c565b6001600160a01b0316145b806121fd57506121fd8185611c2b565b949350505050565b826001600160a01b03166122188261132c565b6001600160a01b03161461226057604051600160e51b62461bcd028152600401808060200182810382526029815260200180612b326029913960400191505060405180910390fd5b6001600160a01b0382166122a857604051600160e51b62461bcd0281526004018080602001828103825260248152602001806129e56024913960400191505060405180910390fd5b6122b1816128e5565b6001600160a01b03838116600081815260036020908152604080832080546000190190559386168083528483208054600190810190915586845290915283822080546bffffffffffffffffffffffff16600160601b83021790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b816001600160a01b031661234c8261132c565b6001600160a01b03161461239457604051600160e51b62461bcd028152600401808060200182810382526025815260200180612be26025913960400191505060405180910390fd5b61239d816128e5565b6001600160a01b038216600081815260036020908152604080832080546000190190558483526001909152808220829055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008060ff8416158015906124145750600460ff851611155b61245257604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806129bb602a913960400191505060405180910390fd5b508160ff84166001141561246a576008549150612480565b809150620186a0600a5482028161247d57fe5b04015b612494868661248e85611c23565b87612617565b94509492505050565b348190036125e43a028111156124da57604051339082156108fc029083906000818181858888f19350505050158015610e21573d6000803e3d6000fd5b5050565b60006124f2846001600160a01b03166128df565b6124fe575060016121fd565b604051600160e11b630a85bd0102815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561257b578181015183820152602001612563565b50505050905090810190601f1680156125a85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125ca57600080fd5b505af11580156125de573d6000803e3d6000fd5b505050506040513d60208110156125f457600080fd5b50516001600160e01b031916600160e11b630a85bd010214915050949350505050565b6126208461213a565b156126755760408051600160e51b62461bcd02815260206004820152601560248201527f43616e27742072657573652057697a6172642049440000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166126d35760408051600160e51b62461bcd02815260206004820152601860248201527f4f776e65722061646472657373206d7573742065786973740000000000000000604482015290519081900360640190fd5b6000821161272b5760408051600160e51b62461bcd02815260206004820152601d60248201527f57697a61726420706f776572206d757374206265206e6f6e2d7a65726f000000604482015290519081900360640190fd5b600160581b821061277057604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612c34602c913960400191505060405180910390fd5b600460ff821611156127cc5760408051600160e51b62461bcd02815260206004820152601a60248201527f496e76616c696420656c656d656e74616c20616666696e697479000000000000604482015290519081900360640190fd5b6040805160608101825260ff83811682526001600160581b0385811660208085019182526001600160a01b0389811686880181815260008d815260018086528a822099518a549751935160ff199098169916989098176bffffffffffffffffffffff0019166101009290971691909102959095176bffffffffffffffffffffffff16600160601b9490921693909302179094558082526003909352838120805490920190915591518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46040805160ff8316815260208101849052815186927f7c0fbd69c04ea8ef6f62724eebd9c311d984e86457a801d81c0cb52ec9039170928290030190a250505050565b3b151590565b6000818152600260205260409020546001600160a01b03161561291f57600081815260026020526040902080546001600160a01b03191690555b50565b60408051606081018252600080825260208201819052918101919091529056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724d757374206265206775696c646d6173746572000000000000000000000000004d7573742063686f6f736520612076616c696420656c656d656e74616c20616666696e6974794e6f6e2d6578636c75736976652057697a61726473206e6565642061207265616c20616666696e6974794552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4d7573742070617920666f7220706f77657220696e20616c6c2057697a61726473416666696e6974792063616e206f6e6c792062652073657420627920746865206f776e65724552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644e65772073746172742074696d65206d757374206265206c61746572207468616e2070726576696f75732073746172742074696d654552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e436f6e7472616374206f776e6572206469646e277420616363657074204552432d373231207472616e7366657257697a61726420706f776572206d7573742066697420696e2038382062697473206f662073746f726167652e53616c652073746172742074696d65206f6e6c792061646a75737461626c65206265666f72652070726576696f75732073746172742074696d6543616e206f6e6c7920736574206f6e636520616e64206d757374206e6f74206265207a65726fa165627a7a723058200beadfe2372f5675c3aa5a195c6ba093f30c9613b11b8d9d2864314aceff2d550029

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

00000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000004d2000000000000000000000000000000000000000000000000000000000076b6b0000000000000000000000000000000000000000000000000000000000000b9ff

-----Decoded View---------------
Arg [0] : startingCost (uint128): 70000000000000000
Arg [1] : costIncremement (uint16): 130
Arg [2] : exclusiveCount (uint256): 1234
Arg [3] : startBlock (uint128): 7780016
Arg [4] : duration (uint128): 47615

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000082
Arg [2] : 00000000000000000000000000000000000000000000000000000000000004d2
Arg [3] : 000000000000000000000000000000000000000000000000000000000076b6b0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000b9ff


Deployed Bytecode Sourcemap

24344:22440:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3963:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3963:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3963:135:0;-1:-1:-1;;;;;;3963:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;10490:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10490:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10490:202:0;;:::i;:::-;;;;-1:-1:-1;;;;;10490:202:0;;;;;;;;;;;;;;9764:433;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9764:433:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9764:433:0;;;;;;;;:::i;:::-;;25242:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25242:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;12158:237;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12158:237:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12158:237:0;;;;;;;;;;;;;;;;;:::i;25863:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25863:39:0;;;:::i;25278:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25278:27:0;;;:::i;13041:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13041:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13041:134:0;;;;;;;;;;;;;;;;;:::i;32157:934::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32157:934:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32157:934:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32157:934:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32157:934:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;32157:934:0;;-1:-1:-1;32157:934:0;-1:-1:-1;32157:934:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32157:934:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32157:934:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32157:934:0;;;;;;;;;;;;;;;;;;;;;30627:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30627:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30627:116:0;;:::i;29261:385::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29261:385:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29261:385:0;-1:-1:-1;;;;;29261:385:0;;:::i;43056:736::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43056:736:0;;;;:::i;9100:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9100:233:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9100:233:0;;:::i;7198:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7198:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7198:47:0;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;;;7198:47:0;;;;;;;-1:-1:-1;;;;;7198:47:0;;;;;;;;;;;;;;29714:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29714:159:0;;;:::i;8676:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8676:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8676:199:0;-1:-1:-1;;;;;8676:199:0;;:::i;35933:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35933:256:0;;;;;;;-1:-1:-1;;;;;35933:256:0;;;;;;;;:::i;25083:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25083:34:0;;;:::i;46693:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46693:88:0;;;:::i;25366:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25366:32:0;;;:::i;18903:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18903:63:0;;;:::i;:::-;;;;-1:-1:-1;;;;;;18903:63:0;;;;;;;;;;;;;;39387:596;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39387:596:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39387:596:0;;;;;;;;;:::i;25983:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25983:28:0;;;:::i;10992:246::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10992:246:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10992:246:0;;;;;;;;;;:::i;26335:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26335:33:0;;;:::i;31472:395::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31472:395:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31472:395:0;;:::i;:::-;;;;-1:-1:-1;;;;;31472:395:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13894:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13894:268:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;13894:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;13894:268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13894:268:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;13894:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;13894:268:0;;-1:-1:-1;13894:268:0;;-1:-1:-1;;;;;13894:268:0:i;44355:2244::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44355:2244:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44355:2244:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44355:2244:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;44355:2244:0;;-1:-1:-1;44355:2244:0;-1:-1:-1;44355:2244:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44355:2244:0;;;;;;;;;;;;;;;;;26104:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26104:27:0;;;:::i;30411:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30411:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30411:115:0;;:::i;11567:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11567:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11567:147:0;;;;;;;;;;:::i;25513:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25513:34:0;;;:::i;36622:266::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36622:266:0;;;;;;;-1:-1:-1;;;;;36622:266:0;;;;;;;;:::i;29983:309::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29983:309:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29983:309:0;;:::i;:::-;;;;-1:-1:-1;;;;;29983:309:0;;;;;-1:-1:-1;;;;;29983:309:0;;;;;;;;;;;;;;;;;;;;;;28890:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28890:208:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28890:208:0;-1:-1:-1;;;;;28890:208:0;;:::i;37424:1542::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;37424:1542:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37424:1542:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37424:1542:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37424:1542:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37424:1542:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37424:1542:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37424:1542:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37424:1542:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37424:1542:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37424:1542:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37424:1542:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37424:1542:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;37424:1542:0;;-1:-1:-1;37424:1542:0;-1:-1:-1;37424:1542:0;:::i;3963:135::-;-1:-1:-1;;;;;;4057:33:0;4033:4;4057:33;;;;;;;;;;;;;;3963:135::o;10490:202::-;10549:7;10577:16;10585:7;10577;:16::i;:::-;10569:73;;;;-1:-1:-1;;;;;10569:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10660:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;10660:24:0;;10490:202::o;9764:433::-;9828:13;9844:16;9852:7;9844;:16::i;:::-;9828:32;;9885:5;-1:-1:-1;;;;;9879:11:0;:2;-1:-1:-1;;;;;9879:11:0;;;9871:57;;;;-1:-1:-1;;;;;9871:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9961:10;-1:-1:-1;;;;;9961:19:0;;;;:58;;;9984:35;10001:5;10008:10;9984:16;:35::i;:::-;9939:164;;;;-1:-1:-1;;;;;9939:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10116:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;10116:29:0;-1:-1:-1;;;;;10116:29:0;;;;;;;;;10161:28;;10116:24;;10161:28;;;;;;;9764:433;;;:::o;25242:29::-;;;;:::o;12158:237::-;12249:39;12268:10;12280:7;12249:18;:39::i;:::-;12241:101;;;;-1:-1:-1;;;;;12241:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12355:32;12369:4;12375:2;12379:7;12355:13;:32::i;:::-;12158:237;;;:::o;25863:39::-;;;;:::o;25278:27::-;;;;:::o;13041:134::-;13128:39;13145:4;13151:2;13155:7;13128:39;;;;;;;;;;;;:16;:39::i;32157:934::-;27917:10;;32254:23;;;;;;-1:-1:-1;;;;;27917:10:0;27903;:24;27895:55;;;;;-1:-1:-1;;;;;27895:55:0;;;;;;;;;;;;-1:-1:-1;;;;;27895:55:0;;;;;;;;;;;;;;;32384:25;;;;;;;;;;;;;;;;32398:3;32384:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32384:25:0;-1:-1:-1;32429:25:0;;;;;;;;;;;;;;;;32375:34;;-1:-1:-1;32443:3:0;32429:25;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32429:25:0;-1:-1:-1;32478:23:0;;;;;;;;;;;;;;;;32420:34;;-1:-1:-1;32490:3:0;32478:23;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32478:23:0;-1:-1:-1;32465:36:0;-1:-1:-1;32578:21:0;;32678:321;32698:14;;;32678:321;;;32774:17;32784:3;;32788:1;32784:6;;;;;;;;;;;;;32774:9;:17::i;:::-;32734:57;-1:-1:-1;;;;;32734:57:0;;;32735:6;32742:1;32735:9;;;;;;;;;;;;;32746:6;32753:1;32746:9;;;;;;;;;;;;;32757:10;32768:1;32757:13;;;;;;;;;;;;;32734:57;;;;;;;;;;;;;-1:-1:-1;;;;;32734:57:0;-1:-1:-1;;;;;32734:57:0;;;;;;;32864:24;32870:6;32877:1;32870:9;;;;;;;;;;;;;;32881:3;;32885:1;32881:6;;;;;;;;;;;;;32864:5;:24::i;:::-;32965:22;32977:6;32984:1;32977:9;;;;;;;;;;;;;;32965:11;:22::i;:::-;32948:39;;;;32714:3;;32678:321;;;-1:-1:-1;33049:34:0;;:10;;:34;;;;;33069:13;;33049:34;;;;33069:13;33049:10;:34;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33049:34:0;27961:1;32157:934;;;;;:::o;30627:116::-;24665:4;30716:19;;30627:116::o;29261:385::-;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;29360:14;;29345:12;:29;29337:100;;;;-1:-1:-1;;;;;29337:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29467:14;;29456:8;-1:-1:-1;;;;;29456:25:0;;29448:91;;;;-1:-1:-1;;;;;29448:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29575:14;;29557:43;;;;;;-1:-1:-1;;;;;29557:43:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29613:25:0;:14;:25;29261:385::o;43056:736::-;43136:16;28560:14;;28544:12;:30;;28536:60;;;;;-1:-1:-1;;;;;28536:60:0;;;;;;;;;;;;-1:-1:-1;;;;;28536:60:0;;;;;;;;;;;;;;;28647:12;;28630:14;;:29;28615:12;:44;28607:68;;;;;-1:-1:-1;;;;;28607:68:0;;;;;;;;;;;;-1:-1:-1;;;;;28607:68:0;;;;;;;;;;;;;;;-1:-1:-1;43178:12:0;;;43201:14;;;;;;43342:19;;43201:12;;43295:67;;43178:12;;43320:10;;43332:8;;43295:14;:67::i;:::-;43272:19;43259:103;;-1:-1:-1;43383:9:0;:23;-1:-1:-1;43383:23:0;43375:57;;;;;-1:-1:-1;;;;;43375:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43481:27;43497:10;43481:15;:27::i;:::-;43700:60;43731:1;43735:10;43747:8;43700:60;;;;;;;;;;;;:22;:60::i;:::-;43692:92;;;;;-1:-1:-1;;;;;43692:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28686:1;43056:736;;;:::o;9100:233::-;9155:7;9191:21;;;:12;:21;;;;;:27;-1:-1:-1;;;9191:27:0;;-1:-1:-1;;;;;9191:27:0;;9229:73;;;;-1:-1:-1;;;;;9229:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9320:5;9100:233;-1:-1:-1;;9100:233:0:o;7198:47::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7198:47:0;;-1:-1:-1;;;7198:47:0;;-1:-1:-1;;;;;7198:47:0;;:::o;29714:159::-;29761:4;29802:14;;29786:12;:30;;:78;;;;;29852:12;;29835:14;;:29;29820:12;:44;29786:78;29778:87;;29714:159;:::o;8676:199::-;8731:7;-1:-1:-1;;;;;8759:19:0;;8751:74;;;;-1:-1:-1;;;;;8751:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8843:24:0;;;;;:17;:24;;;;;;;8676:199::o;35933:256::-;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;36063:1;36058:2;:6;:29;;;;;36074:13;;36068:2;:19;;36058:29;36050:62;;;;;-1:-1:-1;;;;;36050:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36123:58;36137:2;36141:5;36148:22;36160:9;36148:11;:22::i;:::-;36172:8;36123:13;:58::i;25083:34::-;;;-1:-1:-1;;;;;25083:34:0;;:::o;46693:88::-;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;46761:11;;-1:-1:-1;;;;;46761:11:0;46748:25;25366:32;;;;:::o;18903:63::-;-1:-1:-1;;;;;18903:63:0;:::o;39387:596::-;39473:28;;;;;;;:58;;-1:-1:-1;22300:1:0;39505:26;;;;;39473:58;39465:99;;;;;-1:-1:-1;;;;;39465:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39576:13;39593:14;39611:19;39621:8;39611:9;:19::i;:::-;39575:55;;;;;39663:5;-1:-1:-1;;;;;39649:19:0;:10;-1:-1:-1;;;;;39649:19:0;;39641:69;;;;-1:-1:-1;;;;;39641:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39729:26;;;;39721:71;;;;;-1:-1:-1;;;;;39721:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39805:22;;;;:12;:22;;;;;;;;;:45;;-1:-1:-1;;39805:45:0;;;;;;;;;;39929:46;;;;;;;39805:22;;39929:46;;;;;;;;;39387:596;;;;:::o;25983:28::-;;;;:::o;10992:246::-;-1:-1:-1;;;;;11072:16:0;;11078:10;11072:16;;11064:54;;;;;-1:-1:-1;;;;;11064:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11148:10;11129:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;11129:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;11129:45:0;;;;;;;;;;11190:40;;;;;;;11129:34;;11148:10;11190:40;;;;;;;;;;;10992:246;;:::o;26335:33::-;;;-1:-1:-1;;;;;26335:33:0;;:::o;31472:395::-;27917:10;;31539:13;;;;;;-1:-1:-1;;;;;27917:10:0;27903;:24;27895:55;;;;;-1:-1:-1;;;;;27895:55:0;;;;;;;;;;;;-1:-1:-1;;;;;27895:55:0;;;;;;;;;;;;;;;31623:13;31633:2;31623:9;:13::i;:::-;31596:40;;-1:-1:-1;;;;;;31596:40:0;;-1:-1:-1;31596:40:0;-1:-1:-1;31701:16:0;31596:40;31714:2;31701:5;:16::i;:::-;31820:10;:39;31840:18;31852:5;31840:11;:18::i;:::-;31820:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31820:39:0;31472:395;;;;;:::o;13894:268::-;14001:31;14014:4;14020:2;14024:7;14001:12;:31::i;:::-;14051:48;14074:4;14080:2;14084:7;14093:5;14051:22;:48::i;:::-;14043:111;;;;-1:-1:-1;;;;;14043:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13894:268;;;;:::o;44355:2244::-;44466:26;28560:14;;28544:12;:30;;28536:60;;;;;-1:-1:-1;;;;;28536:60:0;;;;;;;;;;;;-1:-1:-1;;;;;28536:60:0;;;;;;;;;;;;;;;28647:12;;28630:14;;:29;28615:12;:44;28607:68;;;;;-1:-1:-1;;;;;28607:68:0;;;;;;;;;;;;-1:-1:-1;;;;;28607:68:0;;;;;;;;;;;;;;;44556:32;;;;;;;;;;;;;;;;44570:10;44556:32;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;44556:32:0;-1:-1:-1;44918:12:0;;44975:19;;44544:44;;-1:-1:-1;44601:17:0;;;45007:412;45027:21;;;45007:412;;;45085:12;45070:9;45080:1;45070:12;;;;;;;;;;;;;:27;;;;;45112:14;;;;;;;45143:18;45218:149;45251:9;45261:1;45251:12;;;;;;;;;;;;;;45282:10;45311;;45322:1;45311:13;;;;;;;;;;;;;;;45343:23;45218:14;:149::i;:::-;45384:23;;;45178:189;-1:-1:-1;;45050:3:0;;45007:412;;;-1:-1:-1;45431:19:0;:45;;;45487:12;:27;;;45582:9;:22;-1:-1:-1;45582:22:0;45574:56;;;;;-1:-1:-1;;;;;45574:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46180:22;46191:10;46180;:22::i;:::-;46176:341;;;46224:9;46219:287;46243:9;:16;46239:1;:20;46219:287;;;46285:13;46317:10;-1:-1:-1;;;;;46301:44:0;;46346:10;46366:1;46370:9;46380:1;46370:12;;;;;;;;;;;;;;46301:86;;;;;;;;;;;;;-1:-1:-1;;;;;46301:86:0;-1:-1:-1;;;;;46301:86:0;;;;;;-1:-1:-1;;;;;46301:86:0;-1:-1:-1;;;;;46301:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46301:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46301:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46301:86:0;;-1:-1:-1;;;;;;;46414:26:0;;-1:-1:-1;;;;;46414:26:0;46406:84;;;;-1:-1:-1;;;;;46406:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46261:3:0;;46219:287;;;;46176:341;46565:26;46581:9;46565:15;:26::i;:::-;28686:1;;;44355:2244;;;;:::o;26104:27::-;;;;:::o;30411:115::-;24665:4;30500:18;;;30411:115::o;11567:147::-;-1:-1:-1;;;;;11671:25:0;;;11647:4;11671:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;11567:147::o;25513:34::-;;;;:::o;36622:266::-;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;36745:43;36768:2;36772:5;36779:8;36745:22;:43::i;:::-;36807:49;36838:1;36842:5;36849:2;36807:49;;;;;;;;;;;;:22;:49::i;:::-;36799:81;;;;;-1:-1:-1;;;;;36799:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29983:309;30035:13;30050:12;30064:14;30091:20;;:::i;:::-;-1:-1:-1;;;30114:16:0;;;;:12;:16;;;;;;;;;30091:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30091:39:0;;;;;;;-1:-1:-1;;;30091:39:0;;;-1:-1:-1;;;;;30091:39:0;;;;;;;;;-1:-1:-1;30091:39:0;;;;30224:60;;;;;-1:-1:-1;;;;;30224:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28890:208;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;28977:10;;-1:-1:-1;;;;;28977:10:0;:24;:44;;;;-1:-1:-1;;;;;;29005:16:0;;;;28977:44;28969:95;;;;-1:-1:-1;;;;;28969:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29075:10;:15;;-1:-1:-1;;;;;;29075:15:0;-1:-1:-1;;;;;29075:15:0;;;;;;;;;;28890:208::o;37424:1542::-;28112:11;;-1:-1:-1;;;;;28112:11:0;28098:10;:25;28090:57;;;;;-1:-1:-1;;;;;28090:57:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28090:57:0;;;;;;;;;;;;;;;37733:27;;;:74;;;;-1:-1:-1;37777:30:0;;;37733:74;:125;;;;-1:-1:-1;37824:34:0;;;37733:125;37711:204;;;;;-1:-1:-1;;;;;37711:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37928:18;;37963:347;37983:14;;;37963:347;;;38036:1;38027:3;;38031:1;38027:6;;;;;;;;;;;;;:10;:37;;;;;38051:13;;38041:3;;38045:1;38041:6;;;;;;;;;;;;;:23;;38027:37;38019:70;;;;;-1:-1:-1;;;;;38019:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:1;38112:10;;38123:1;38112:13;;;;;;;;;;;;;;;:28;;;;38104:79;;;;-1:-1:-1;;;;;38104:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38200:58;38214:3;;38218:1;38214:6;;;;;;;;;;;;;38222;;38229:1;38222:9;;;;;;;;;;;;;-1:-1:-1;;;;;38222:9:0;38233:6;;38240:1;38233:9;;;;;;;;;;;;;38244:10;;38255:1;38244:13;;;;;;;;;;;;;;;38200;:58::i;:::-;38289:6;;38296:1;38289:9;;;;;;;;;;;;;;38275:23;;;;;-1:-1:-1;37999:3:0;;37963:347;;;;38701:9;38674:23;38686:10;38674:11;:23::i;:::-;:36;;38666:82;;;;-1:-1:-1;;;;;38666:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28158:1;37424:1542;;;;;;;;:::o;14363:162::-;14420:4;14453:21;;;:12;:21;;;;;:27;-1:-1:-1;;;14453:27:0;;-1:-1:-1;;;;;14453:27:0;14498:19;;;14363:162::o;14894:333::-;14979:4;15004:16;15012:7;15004;:16::i;:::-;14996:73;;;;-1:-1:-1;;;;;14996:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15080:13;15096:16;15104:7;15096;:16::i;:::-;15080:32;;15142:5;-1:-1:-1;;;;;15131:16:0;:7;-1:-1:-1;;;;;15131:16:0;;:51;;;;15175:7;-1:-1:-1;;;;;15151:31:0;:20;15163:7;15151:11;:20::i;:::-;-1:-1:-1;;;;;15151:31:0;;15131:51;:87;;;;15186:32;15203:5;15210:7;15186:16;:32::i;:::-;15123:96;14894:333;-1:-1:-1;;;;14894:333:0:o;16596:446::-;16710:4;-1:-1:-1;;;;;16690:24:0;:16;16698:7;16690;:16::i;:::-;-1:-1:-1;;;;;16690:24:0;;16682:78;;;;-1:-1:-1;;;;;16682:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16779:16:0;;16771:65;;;;-1:-1:-1;;;;;16771:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16849:23;16864:7;16849:14;:23::i;:::-;-1:-1:-1;;;;;16885:23:0;;;;;;;:17;:23;;;;;;;;:25;;-1:-1:-1;;16885:25:0;;;16921:21;;;;;;;;;:23;;-1:-1:-1;16921:23:0;;;;;;16957:21;;;;;;;;;:32;;;;-1:-1:-1;;;16957:32:0;;;;;17007:27;;16957:21;;16921;16885:23;17007:27;;;16596:446;;;:::o;15509:425::-;15604:5;-1:-1:-1;;;;;15584:25:0;:16;15592:7;15584;:16::i;:::-;-1:-1:-1;;;;;15584:25:0;;15576:75;;;;-1:-1:-1;;;;;15576:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15664:23;15679:7;15664:14;:23::i;:::-;-1:-1:-1;;;;;15700:24:0;;;;;;:17;:24;;;;;;;;:26;;-1:-1:-1;;15700:26:0;;;15805:21;;;15700:26;15805:21;;;;;;15798:28;;;15890:36;15818:7;;15700:24;15890:36;;15700:24;;15890:36;15509:425;;:::o;41194:1189::-;41363:18;;41492:25;;;;;;;:52;;-1:-1:-1;22300:1:0;41521:23;;;;;41492:52;41484:107;;;;-1:-1:-1;;;;;41484:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41633:23:0;41705:27;;;22028:1;41705:27;41701:548;;;41762:17;;41749:30;;41701:548;;;41825:26;41812:39;;24785:6;42191:24;;42162:26;:53;42161:76;;;;;;42131:106;41701:548;42310:65;42324:8;42334:5;42341:23;42353:10;42341:11;:23::i;:::-;42366:8;42310:13;:65::i;:::-;41194:1189;;;;;;;:::o;34778:555::-;34860:9;:23;;;35260:8;35245:11;:24;35235:35;;35231:95;;;35287:27;;:10;;:27;;;;;35307:6;;35287:27;;;;35307:6;35287:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;35231:95:0;34778:555;;:::o;17581:356::-;17703:4;17730:15;:2;-1:-1:-1;;;;;17730:13:0;;:15::i;:::-;17725:60;;-1:-1:-1;17769:4:0;17762:11;;17725:60;17813:70;;-1:-1:-1;;;;;17813:70:0;;17850:10;17813:70;;;;;;-1:-1:-1;;;;;17813:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17797:13;;17813:36;;;;;;17850:10;;17862:4;;17868:7;;17877:5;;17813:70;;;;;;;;;;;17797:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17813:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17813:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17813:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17813:70:0;-1:-1:-1;;;;;;17902:26:0;-1:-1:-1;;;;;17902:26:0;;-1:-1:-1;;17581:356:0;;;;;;:::o;33626:731::-;33741:16;33749:7;33741;:16::i;:::-;33740:17;33732:51;;;;;-1:-1:-1;;;;;33732:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33802:19:0;;33794:56;;;;;-1:-1:-1;;;;;33794:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33877:1;33869:5;:9;33861:51;;;;;-1:-1:-1;;;;;33861:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33931:5:0;:15;33923:72;;;;-1:-1:-1;;;;;33923:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:1;34014:23;;;;;34006:62;;;;;-1:-1:-1;;;;;34006:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34136:38;;;;;;;;;;;;;;-1:-1:-1;;;;;34136:38:0;;;;;;;;;;-1:-1:-1;;;;;34136:38:0;;;;;;;;;-1:-1:-1;34112:21:0;;;:12;:21;;;;;;:62;;;;;;;;-1:-1:-1;;34112:62:0;;;;;;;;;-1:-1:-1;;34112:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;34112:62:0;;;;;;;;;;;;34185:24;;;:17;:24;;;;;;:26;;;;;;;;34257:36;;34112:21;;-1:-1:-1;34257:36:0;;-1:-1:-1;;34257:36:0;34309:40;;;;;;;;;;;;;;;;34324:7;;34309:40;;;;;;;;33626:731;;;;:::o;20985:686::-;21565:20;21655:8;;;20985:686::o;18104:175::-;18204:1;18168:24;;;:15;:24;;;;;;-1:-1:-1;;;;;18168:24:0;:38;18164:108;;18258:1;18223:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;18223:37:0;;;18164:108;18104:175;:::o;24344:22440::-;;;;;;;;;-1:-1:-1;24344:22440:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://0beadfe2372f5675c3aa5a195c6ba093f30c9613b11b8d9d2864314aceff2d55
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.