ETH Price: $3,319.81 (-1.19%)

Contract

0x2F4Bdafb22bd92AA7b7552d270376dE8eDccbc1E
 
Transaction Hash
Method
Block
From
To
Transfer From170473422023-04-14 19:05:23588 days ago1681499123IN
CheeseWizard: Presale
0 ETH0.0005793626.39234632
Transfer From163325892023-01-04 9:40:11688 days ago1672825211IN
CheeseWizard: Presale
0 ETH0.000390617.79349244
Transfer From163325892023-01-04 9:40:11688 days ago1672825211IN
CheeseWizard: Presale
0 ETH0.000390617.79349244
Approve94558152020-02-10 15:01:381747 days ago1581346898IN
CheeseWizard: Presale
0 ETH0.000107925
Conjure Wizard92460912020-01-09 11:04:101779 days ago1578567850IN
CheeseWizard: Presale
0.99503006 ETH0.0004240820
Conjure Wizard92460912020-01-09 11:04:101779 days ago1578567850IN
CheeseWizard: Presale
0.07 ETH0.0002120410
Conjure Wizard92460912020-01-09 11:04:101779 days ago1578567850IN
CheeseWizard: Presale
0.99503006 ETH0.0004240820
Conjure Wizard92460912020-01-09 11:04:101779 days ago1578567850IN
CheeseWizard: Presale
0.83635682 ETH0.00004242
Transfer From87883832019-10-22 5:22:351858 days ago1571721755IN
CheeseWizard: Presale
0 ETH0.000125615.16
Approve87753632019-10-20 3:53:121860 days ago1571543592IN
CheeseWizard: Presale
0 ETH0.000091744
Approve87719512019-10-19 15:09:341861 days ago1571497774IN
CheeseWizard: Presale
0 ETH0.000099084.32
Transfer From87715192019-10-19 13:25:501861 days ago1571491550IN
CheeseWizard: Presale
0 ETH0.0002921212
Approve87714972019-10-19 13:18:351861 days ago1571491115IN
CheeseWizard: Presale
0 ETH0.00016017
Approve87714932019-10-19 13:17:121861 days ago1571491032IN
CheeseWizard: Presale
0 ETH0.000091484
Transfer From87669562019-10-18 20:16:251862 days ago1571429785IN
CheeseWizard: Presale
0 ETH0.000097124
Transfer From87669552019-10-18 20:15:581862 days ago1571429758IN
CheeseWizard: Presale
0 ETH0.000097124
Transfer From87669532019-10-18 20:15:241862 days ago1571429724IN
CheeseWizard: Presale
0 ETH0.000097124
Transfer From87669462019-10-18 20:14:081862 days ago1571429648IN
CheeseWizard: Presale
0 ETH0.000097124
Transfer From87669382019-10-18 20:12:501862 days ago1571429570IN
CheeseWizard: Presale
0 ETH0.000097124
Approve87628502019-10-18 4:52:521862 days ago1571374372IN
CheeseWizard: Presale
0 ETH0.000045742
Transfer From87604742019-10-17 19:48:031863 days ago1571341683IN
CheeseWizard: Presale
0 ETH0.000097374
Transfer From87604502019-10-17 19:43:131863 days ago1571341393IN
CheeseWizard: Presale
0 ETH0.000097124
Approve87603322019-10-17 19:16:401863 days ago1571339800IN
CheeseWizard: Presale
0 ETH0.000091744
Destroy87597152019-10-17 16:56:061863 days ago1571331366IN
CheeseWizard: Presale
0 ETH0.000067285
Approve87485332019-10-15 22:24:461865 days ago1571178286IN
CheeseWizard: Presale
0 ETH0.000118625
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
87597152019-10-17 16:56:061863 days ago1571331366
CheeseWizard: Presale
888.99299567 ETH
87473862019-10-15 18:10:401865 days ago1571163040
CheeseWizard: Presale
0.78160265 ETH
87473772019-10-15 18:08:251865 days ago1571162905
CheeseWizard: Presale
0.1794431 ETH
87473672019-10-15 18:05:581865 days ago1571162758
CheeseWizard: Presale
1.05622647 ETH
87473222019-10-15 17:55:561865 days ago1571162156
CheeseWizard: Presale
6.41587072 ETH
87472662019-10-15 17:44:151865 days ago1571161455
CheeseWizard: Presale
26.67369379 ETH
87471932019-10-15 17:27:351865 days ago1571160455
CheeseWizard: Presale
15.57135683 ETH
87471452019-10-15 17:18:411865 days ago1571159921
CheeseWizard: Presale
3.54686981 ETH
87471442019-10-15 17:18:391865 days ago1571159919
CheeseWizard: Presale
2.0182392 ETH
87470042019-10-15 16:48:311865 days ago1571158111
CheeseWizard: Presale
6.91380598 ETH
87470032019-10-15 16:48:301865 days ago1571158110
CheeseWizard: Presale
0.5673468 ETH
87469072019-10-15 16:22:411865 days ago1571156561
CheeseWizard: Presale
2.1368951 ETH
87469052019-10-15 16:22:191865 days ago1571156539
CheeseWizard: Presale
0.88770193 ETH
87467812019-10-15 15:53:461865 days ago1571154826
CheeseWizard: Presale
1.11978678 ETH
87467652019-10-15 15:51:221865 days ago1571154682
CheeseWizard: Presale
3.06561609 ETH
87467632019-10-15 15:50:581865 days ago1571154658
CheeseWizard: Presale
11.26766587 ETH
87467172019-10-15 15:39:101865 days ago1571153950
CheeseWizard: Presale
0.07 ETH
87467022019-10-15 15:34:571865 days ago1571153697
CheeseWizard: Presale
1.31206706 ETH
87466862019-10-15 15:32:101865 days ago1571153530
CheeseWizard: Presale
0.07 ETH
87466592019-10-15 15:26:211865 days ago1571153181
CheeseWizard: Presale
0.49975795 ETH
87465802019-10-15 15:09:271865 days ago1571152167
CheeseWizard: Presale
17.21237338 ETH
87465652019-10-15 15:05:271865 days ago1571151927
CheeseWizard: Presale
3.66529034 ETH
87465522019-10-15 15:02:131865 days ago1571151733
CheeseWizard: Presale
2.05417198 ETH
87464052019-10-15 14:30:421865 days ago1571149842
CheeseWizard: Presale
0.14 ETH
87463732019-10-15 14:24:411865 days ago1571149481
CheeseWizard: Presale
0.07 ETH
View All Internal Transactions
Loading...
Loading
Contract Self Destruct called at Txn Hash 0xb977e18251ae140183689e7342656048b040cdf9242871ae15384868dcdb9565


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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.