ETH Price: $3,890.24 (+4.63%)

Contract

0x35A7Bc54E7D312BCB40a7dcA859D44e8F2a2D768
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DroppableEditionsLogic

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 13 : DroppableEditionsLogic.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

import {IERC721, IERC721Events, IERC721Receiver, IERC721Metadata, IERC165} from "../../../external/interface/IERC721.sol";
import {IERC2309} from "../../../external/interface/IERC2309.sol";
import {ITreasuryConfig} from "../../../interface/ITreasuryConfig.sol";
import {IMirrorTreasury} from "../../../interface/IMirrorTreasury.sol";
import {InitializedGovernable} from "../../../lib/InitializedGovernable.sol";
import {Pausable} from "../../../lib/Pausable.sol";
import {Reentrancy} from "../../../lib/Reentrancy.sol";
import {DroppableEditionsStorage} from "./DroppableEditionsStorage.sol";
import {IDroppableEditionsLogicEvents} from "./interface/IDroppableEditionsLogic.sol";
import {IProxyRegistry} from '../../../external/opensea/IProxyRegistry.sol';

/**
 * @title DroppableEditionsLogic
 * @author MirrorXYZ
 */
contract DroppableEditionsLogic is 
    DroppableEditionsStorage,
    InitializedGovernable,
    Pausable,
    IDroppableEditionsLogicEvents,
    IERC721,
    IERC721Events,
    IERC165,
    IERC721Metadata,
    IERC2309,
    Reentrancy
{

    /// @notice IERC721Metadata
    string public override name;
    string public override symbol;

    constructor(
        address owner_,
        address governor_,
        address proxyRegistry_
    ) InitializedGovernable(owner_, governor_) Pausable(true) {
        proxyRegistry = proxyRegistry_;
    }

    // ============ Pause Methods ============

    /// @notice pause purchases
    function pause() public onlyGovernance {
        _pause();
    }

    /// @notice unpause purchases
    function unpause() public onlyGovernance {
        _unpause();
    }

    // ============ Edition Methods ============

    function purchase(address recipient)
        external
        payable
        whenNotPaused
        returns (uint256 tokenId)
    {
        // Check that recipient has not already purchased
        require(!purchased[recipient], "already purchased");
        // Check that enough funds have been sent to purchase an edition.
        require(msg.value >= price, "insufficient funds");
        // Track and update token id.
        tokenId = allocation + nonAllocatedPurchases;
        // Check that there are still tokens available to purchase.
        require(tokenId < quantity, "sold out");
        // Mint a new token for the sender, using the `tokenId`.
        purchased[recipient] = true;
        _mint(recipient, tokenId);
        emit EditionPurchased(tokenId, msg.value, msg.sender, recipient);

        nonAllocatedPurchases += 1;
    }

    // ============ NFT Methods ============

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function balanceOf(address owner_) public view override returns (uint256) {
        require(
            owner_ != address(0),
            "zero address"
        );

        return _balances[owner_];
    }

    function burn(uint256 tokenId) public {
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "not approved"
        );

        _burn(tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "not approved"
        );

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "not approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        return string(abi.encodePacked(baseURI, _toString(tokenId)));
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);
        require(to != owner, "current owner");

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "not approved"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "nonexistent"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address approver, bool approved)
        public
        override
    {
        require(approver != msg.sender, "approve to caller");

        _operatorApprovals[msg.sender][approver] = approved;
        emit ApprovalForAll(msg.sender, approver, approved);
    }

    /**
     * @notice OpenSea proxy contracts are approved by default.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Approve all OpenSea proxy contracts for easy trading.
        if (IProxyRegistry(proxyRegistry).proxies(owner) == operator) {
            return true;
        }

        return _operatorApprovals[owner][operator];
    }

    /// @notice e.g. https://mirror-api.com/editions/metadata
    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "metadata"));
    }

    /**
     * @notice The hash of the given content for the NFT. Can be used
     * for IPFS storage, verifying authenticity, etc.
     */
    function getContentHash(uint256) public view returns (bytes32) {
        return contentHash;
    }

    // ============ Operational Methods ============

    function withdrawFunds() external Reentrancy.nonReentrant {
        // Transfer the fee to the treasury.
        // Treasury fee is paid first for efficiency, so we don't have to calculate
        // the fee and the revenue amount. Also prevents a reentrancy attack scenario that
        // avoids paying treasury.
        uint256 fee = feeAmount(address(this).balance);
        IMirrorTreasury(ITreasuryConfig(treasuryConfig).treasury())
            .contribute{value: fee}(fee);

        // Transfer the remaining available balance to the fundingRecipient.
        _sendFunds(fundingRecipient, address(this).balance);
    }

    function feeAmount(uint256 amount) public view returns (uint256) {
        return (feePercentage * amount) / 10000;
    }

    // ============ Admin Methods ============

    function changeBaseURI(string memory baseURI_) public onlyGovernance {
        baseURI = baseURI_;
    }

    // ============ Drop Distribution Methods ============

    function purchaseWithProof(
        address account,
        uint256 allocation,
        uint256 price,
        uint256 index,
        bytes32[] calldata merkleProof
    ) external payable {
        require(price * allocation <= msg.value, "insufficient funds");

        require(
            !isClaimed(index, account),
            "already claimed"
        );

        setClaimed(index, account);

        require(
            verifyProof(
                merkleProof,
                merkleRoot,
                getNode(index, price, account, allocation)
            ),
            "invalid proof"
        );

        // "MINT"
        indexToClaimer[currentIndexId] = account;
        currentIndexId += 1;
        claimerToAllocation[account] = allocation;
        claimedTokens += allocation;
        _balances[account] += allocation;

        emit ConsecutiveTransfer(
            nextTokenId,
            nextTokenId + allocation - 1,
            address(0),
            account
        );

        nextTokenId += allocation;
    }

    function ownerOf(uint256 tokenId)
        public
        view
        override
        returns (address owner)
    {
        
        // Check if we are referring to a token that was preallocated.
        if (tokenId < allocation) {
            // It may have not been claimed.
            require(tokenId < claimedTokens, "nonexistent");

            // Check if this token was allocated but then burned.
            require(!_burned[tokenId], "nonexistent");

            // Check if this token was allocated and then transferred.
            if (_owners[tokenId] != address(0)) {
                // The token was allocated, but then transferred.
                return _owners[tokenId];
            }
            
            // The token has been claimed and not transferred!
            // We need to find the claimer from this tokenId.
            uint256 indexTracker;
            for (uint256 i = 0; i < currentIndexId; i++) {
                address claimer = indexToClaimer[i];
                indexTracker += claimerToAllocation[claimer];
                if (tokenId < indexTracker) {
                    return claimer;
                }
            }
        }
        
        owner = _owners[tokenId];

        require(owner != address(0), "nonexistent");
    }


    function isClaimed(uint256 index, address account)
        public
        view
        returns (bool)
    {
        return claimed[getClaimHash(index, account)];
    }

    function setClaimed(uint256 index, address account) private {
        claimed[getClaimHash(index, account)] = true;
    }

    function getClaimHash(uint256 index, address account)
        private
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(index, account));
    }

    function getNode(uint256 index, uint256 price, address account, uint256 allocation)
        private
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(account, allocation, price, index));
    }

    // From https://github.com/protofire/zeppelin-solidity/blob/master/contracts/MerkleProof.sol
    function verifyProof(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) private pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }


    // ============ Private Methods ============

    /// @notice from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol
    function _toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    function _sendFunds(address payable recipient, uint256 amount) private {
        require(
            address(this).balance >= amount,
            "insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "recipient reverted");
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        if (tokenId < allocation && !_burned[tokenId]) {
            return true;
        }

        return _owners[tokenId] != address(0);
    }

    function _burn(uint256 tokenId) internal {
        address owner_ = ownerOf(tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        if (_balances[owner_] > 0) {
            _balances[owner_] -= 1;
        }
        delete _owners[tokenId];

        _burned[tokenId] = true;

        emit Transfer(owner_, address(0), tokenId);
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal pure returns (string memory) {
        return "";
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "non ERC721Receiver"
        );
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        returns (bool)
    {
        require(
            _exists(tokenId),
            "nonexistent"
        );
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "zero address");
        require(!_exists(tokenId), "already minted");

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(
            ownerOf(tokenId) == from,
            "token not owned"
        );
        require(
            to != address(0),
            "zero address"
        );

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        if (_balances[from] > 0) {
            _balances[from] -= 1;
        }

        _owners[tokenId] = to;
        _balances[to] += 1;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (isContract(to)) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "non ERC721Receiver"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /// @notice from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/7f6a1666fac8ecff5dd467d0938069bc221ea9e0/contracts/utils/Address.sol
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

File 2 of 13 : IERC721.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IERC721 {
    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Events {
    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
    );
}

interface IERC721Metadata {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Burnable is IERC721 {
    function burn(uint256 tokenId) external;
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721Royalties {
    function getFeeRecipients(uint256 id)
        external
        view
        returns (address payable[] memory);

    function getFeeBps(uint256 id) external view returns (uint256[] memory);
}

File 3 of 13 : IERC2309.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IERC2309 {
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed fromAddress,
        address indexed toAddress
    );
}

File 4 of 13 : ITreasuryConfig.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface ITreasuryConfig {
    function treasury() external returns (address payable);

    function distributionModel() external returns (address);
}

File 5 of 13 : IMirrorTreasury.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IMirrorTreasury {
    function transferFunds(address payable to, uint256 value) external;

    function transferERC20(
        address token,
        address to,
        uint256 value
    ) external;

    function contributeWithTributary(address tributary) external payable;

    function contribute(uint256 amount) external payable;
}

File 6 of 13 : InitializedGovernable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

import {Ownable} from "../lib/Ownable.sol";
import {IGovernable} from "../lib/interface/IGovernable.sol";

contract InitializedGovernable is Ownable, IGovernable {
    // ============ Events ============

    event GovernorChanged(
        address indexed previousGovernor,
        address indexed newGovernor
    );

    // ============ Mutable Storage ============

    // Mirror governance contract.
    address public override governor;

    // ============ Modifiers ============

    modifier onlyGovernance() {
        require(isOwner() || isGovernor(), "caller is not governance");
        _;
    }

    modifier onlyGovernor() {
        require(isGovernor(), "caller is not governor");
        _;
    }

    // ============ Constructor ============

    constructor(address owner_, address governor_) Ownable(owner_) {
        _setGovernor(governor_);
    }

    // ============ Administration ============

    function changeGovernor(address governor_) public override onlyGovernance {
        _setGovernor(governor_);
    }

    // ============ Utility Functions ============

    function isGovernor() public view override returns (bool) {
        return msg.sender == governor;
    }

    // ============ Internal Functions ============

    function _setGovernor(address governor_) internal {
        emit GovernorChanged(governor, governor_);

        governor = governor_;
    }
}

File 7 of 13 : Pausable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IPausableEvents {
    /// @notice Emitted when the pause is triggered by `account`.
    event Paused(address account);

    /// @notice Emitted when the pause is lifted by `account`.
    event Unpaused(address account);
}

interface IPausable {
    function paused() external returns (bool);
}

contract Pausable is IPausable, IPausableEvents {
    bool public override paused;

    // Modifiers

    modifier whenNotPaused() {
        require(!paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(paused, "Pausable: not paused");
        _;
    }

    /// @notice Initializes the contract in unpaused state.
    constructor(bool paused_) {
        paused = paused_;
    }

    // ============ Internal Functions ============

    function _pause() internal whenNotPaused {
        paused = true;

        emit Paused(msg.sender);
    }

    function _unpause() internal whenPaused {
        paused = false;

        emit Unpaused(msg.sender);
    }
}

File 8 of 13 : Reentrancy.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

contract Reentrancy {
    // ============ Constants ============

    uint256 internal constant REENTRANCY_NOT_ENTERED = 1;
    uint256 internal constant REENTRANCY_ENTERED = 2;

    // ============ Mutable Storage ============

    uint256 internal reentrancyStatus;

    // ============ Modifiers ============

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(reentrancyStatus != REENTRANCY_ENTERED, "Reentrant call");
        // Any calls to nonReentrant after this point will fail
        reentrancyStatus = REENTRANCY_ENTERED;
        _;
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip2200)
        reentrancyStatus = REENTRANCY_NOT_ENTERED;
    }
}

File 9 of 13 : DroppableEditionsStorage.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

/**
 * @title DroppableEditionsStorage
 * @author MirrorXYZ
 */
contract DroppableEditionsStorage {
    // ============ Structs ============

    /// @notice Contains general data about the NFT.
    struct NFTMetadata {
        string name;
        string symbol;
        string baseURI;
        bytes32 contentHash;
    }

    /// @notice Contains information pertaining to the edition spec.
    struct EditionData {
        // The maximum number of tokens that can be sold.
        uint256 quantity;
        uint256 allocation;
        // The price at which each token will be sold, in ETH.
        uint256 price;
    }

    /// @notice Contains information about funds disbursement.
    struct AdminData {
        // Operator of this contract.
        address operator;
        bytes32 merkleRoot;
        // Address that receive gov tokens via treasury.
        address tributary;
        // The account that will receive sales revenue.
        address payable fundingRecipient;
        // The fee taken when withdrawing funds
        uint256 feePercentage;
    }

    // ============ Storage for Setup ============

    /// @notice NFTMetadata`
    string public baseURI;
    bytes32 contentHash;

    /// @notice EditionData
    uint256 public allocation;
    uint256 public quantity;
    uint256 public price;

    /// @notice EditionConfig
    address public operator;
    address public tributary;
    address payable public fundingRecipient;
    uint256 feePercentage;

    /// @notice Treasury Config, provided at setup, for finding the treasury address.
    address treasuryConfig;

    // ============ Mutable Runtime Storage ============

    /// @notice `nextTokenId` increments with each token purchased, globally across all editions.
    uint256 internal nextTokenId;
    /// @notice The number of tokens that have moved outside of the pre-mint allocation.
    uint256 internal allocationsTransferred = 0;

    /**
     * @notice A special mapping of burned tokens, to take care of burning within
     * the tokenId range of the allocation.
     */
    mapping(uint256 => bool) internal _burned;

    // ============ Mutable Internal NFT Storage ============

    mapping(uint256 => address) internal _owners;
    mapping(address => uint256) internal _balances;
    mapping(uint256 => address) internal _tokenApprovals;
    mapping(address => mapping(address => bool)) internal _operatorApprovals;

    /// @notice Only allow one purchase per account.
    mapping(address => bool) internal purchased;

    // OpenSea's Proxy Registry
    address public proxyRegistry;

    bytes32 public merkleRoot;

    uint256 currentTokenId;
    uint256 currentIndexId;
    uint256 claimedTokens;
    uint256 nonAllocatedPurchases = 0;

    mapping(uint256 => bool) public burned;

    mapping(uint256 => address) public indexToClaimer;
    mapping(address => uint256) public claimerToAllocation;

    mapping(bytes32 => bool) public claimed;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT =
        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /// @notice Allows to renounce upgrades
    bool public upgradesAllowed = true;
}

File 10 of 13 : IDroppableEditionsLogic.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IDroppableEditionsLogicEvents {
    event EditionPurchased(
        uint256 indexed tokenId,
        uint256 amountPaid,
        address buyer,
        address receiver
    );

    event EditionCreatorChanged(
        address indexed previousCreator,
        address indexed newCreator
    );
}

File 11 of 13 : IProxyRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

interface IProxyRegistry {
    function proxies(address) external view returns (address);
}

File 12 of 13 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IOwnableEvents {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
}

contract Ownable is IOwnableEvents {
    address public owner;
    address private nextOwner;

    // modifiers

    modifier onlyOwner() {
        require(isOwner(), "caller is not the owner.");
        _;
    }

    modifier onlyNextOwner() {
        require(isNextOwner(), "current owner must set caller as next owner.");
        _;
    }

    /**
     * @dev Initialize contract by setting transaction submitter as initial owner.
     */
    constructor(address owner_) {
        owner = owner_;
        emit OwnershipTransferred(address(0), owner);
    }

    /**
     * @dev Initiate ownership transfer by setting nextOwner.
     */
    function transferOwnership(address nextOwner_) external onlyOwner {
        require(nextOwner_ != address(0), "Next owner is the zero address.");

        nextOwner = nextOwner_;
    }

    /**
     * @dev Cancel ownership transfer by deleting nextOwner.
     */
    function cancelOwnershipTransfer() external onlyOwner {
        delete nextOwner;
    }

    /**
     * @dev Accepts ownership transfer by setting owner.
     */
    function acceptOwnership() external onlyNextOwner {
        delete nextOwner;

        owner = msg.sender;

        emit OwnershipTransferred(owner, msg.sender);
    }

    /**
     * @dev Renounce ownership by setting owner to zero address.
     */
    function renounceOwnership() external onlyOwner {
        _renounceOwnership();
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == owner;
    }

    /**
     * @dev Returns true if the caller is the next owner.
     */
    function isNextOwner() public view returns (bool) {
        return msg.sender == nextOwner;
    }

    function _setOwner(address previousOwner, address newOwner) internal {
        owner = newOwner;
        emit OwnershipTransferred(previousOwner, owner);
    }

    function _renounceOwnership() internal {
        owner = address(0);

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

File 13 of 13 : IGovernable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.6;

interface IGovernable {
    function changeGovernor(address governor_) external;

    function isGovernor() external view returns (bool);

    function governor() external view returns (address);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"governor_","type":"address"},{"internalType":"address","name":"proxyRegistry_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousCreator","type":"address"},{"indexed":true,"internalType":"address","name":"newCreator","type":"address"}],"name":"EditionCreatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"EditionPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governor_","type":"address"}],"name":"changeGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimerToAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"feeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getContentHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexToClaimer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNextOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"purchaseWithProof","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"approver","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nextOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tributary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradesAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b819055601755601c805460ff191660011790553480156200002857600080fd5b5060405162003224380380620032248339810160408190526200004b9162000177565b601c8054610100600160a81b0319166101006001600160a01b0386811682029290921792839055604051600193879387938593920416906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000b681620000fe565b5050601e8054911515600160a01b0260ff60a01b19909216919091179055601280546001600160a01b039092166001600160a01b031990921691909117905550620001c19050565b601e546040516001600160a01b038084169216907fde4b3f61490b74c0ed6237523974fe299126bbbf8a8a7482fd220104c59b0c8490600090a3601e80546001600160a01b0319166001600160a01b0392909216919091179055565b80516001600160a01b03811681146200017257600080fd5b919050565b6000806000606084860312156200018d57600080fd5b62000198846200015a565b9250620001a8602085016200015a565b9150620001b8604085016200015a565b90509250925092565b61305380620001d16000396000f3fe60806040526004361061031e5760003560e01c80636c0360eb116101a5578063af63ff5d116100ec578063d2ef079511610095578063e985e9c51161006f578063e985e9c5146108a5578063ed459df2146108c5578063f2fde38b146108e5578063ffbdc8cb1461090557600080fd5b8063d2ef079514610850578063e4c0aaf414610870578063e8a3d4851461089057600080fd5b8063c7af3352116100c6578063c7af3352146107e0578063c87b56dd14610800578063cc3c0f061461082057600080fd5b8063af63ff5d1461078d578063b50cbd9f146107a0578063b88d4fde146107c057600080fd5b806388a17bde1161014e57806395d89b411161012857806395d89b4114610742578063a035b1fe14610757578063a22cb4651461076d57600080fd5b806388a17bde146106e25780638da5cb5b146106f85780638f32d59b1461071d57600080fd5b8063715018a61161017f578063715018a6146106a357806379ba5097146106b85780638456cb59146106cd57600080fd5b80636c0360eb1461064e5780636c8526571461066357806370a082311461068357600080fd5b806324600fc31161026957806342842e0e116102125780635c975abb116101ec5780635c975abb146105d75780636352211e146105f85780636bc177e81461061857600080fd5b806342842e0e1461057757806342966c6814610597578063570ca735146105b757600080fd5b80632eb4a7ab116102435780632eb4a7ab1461052c57806339a0c6f9146105425780633f4ba83a1461056257600080fd5b806324600fc3146104e457806325b31a97146104f95780632704f9b41461050c57600080fd5b806317fc45e2116102cb57806323250cae116102a557806323250cae1461047f57806323452b9c146104af57806323b872dd146104c457600080fd5b806317fc45e21461040e5780631a5b6279146104325780631bb534ba1461045f57600080fd5b8063095ea7b3116102fc578063095ea7b3146103b2578063099ea2d3146103d45780630c340a24146103ee57600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004612c6f565b610927565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610a0c565b60405161034f9190612e77565b34801561038657600080fd5b5061039a610395366004612c56565b610a9a565b6040516001600160a01b03909116815260200161034f565b3480156103be57600080fd5b506103d26103cd366004612b86565b610b00565b005b3480156103e057600080fd5b50601c546103439060ff1681565b3480156103fa57600080fd5b50601e5461039a906001600160a01b031681565b34801561041a57600080fd5b5061042460035481565b60405190815260200161034f565b34801561043e57600080fd5b5061042461044d366004612a18565b601a6020526000908152604090205481565b34801561046b57600080fd5b5060075461039a906001600160a01b031681565b34801561048b57600080fd5b5061034361049a366004612c56565b60186020526000908152604090205460ff1681565b3480156104bb57600080fd5b506103d2610bd5565b3480156104d057600080fd5b506103d26104df366004612a92565b610c53565b3480156104f057600080fd5b506103d2610ca3565b610424610507366004612a18565b610e10565b34801561051857600080fd5b5060065461039a906001600160a01b031681565b34801561053857600080fd5b5061042460135481565b34801561054e57600080fd5b506103d261055d366004612ca9565b611020565b34801561056e57600080fd5b506103d26110ab565b34801561058357600080fd5b506103d2610592366004612a92565b611129565b3480156105a357600080fd5b506103d26105b2366004612c56565b611144565b3480156105c357600080fd5b5060055461039a906001600160a01b031681565b3480156105e357600080fd5b50601e5461034390600160a01b900460ff1681565b34801561060457600080fd5b5061039a610613366004612c56565b611195565b34801561062457600080fd5b5061039a610633366004612c56565b6019602052600090815260409020546001600160a01b031681565b34801561065a57600080fd5b5061036d611326565b34801561066f57600080fd5b5061042461067e366004612c56565b611333565b34801561068f57600080fd5b5061042461069e366004612a18565b611350565b3480156106af57600080fd5b506103d26113c4565b3480156106c457600080fd5b506103d261142b565b3480156106d957600080fd5b506103d2611537565b3480156106ee57600080fd5b5061042460025481565b34801561070457600080fd5b50601c5461039a9061010090046001600160a01b031681565b34801561072957600080fd5b50601c5461010090046001600160a01b03163314610343565b34801561074e57600080fd5b5061036d6115b3565b34801561076357600080fd5b5061042460045481565b34801561077957600080fd5b506103d2610788366004612b53565b6115c0565b6103d261079b366004612bb2565b611685565b3480156107ac57600080fd5b5060125461039a906001600160a01b031681565b3480156107cc57600080fd5b506103d26107db366004612ad3565b611940565b3480156107ec57600080fd5b50601e546001600160a01b03163314610343565b34801561080c57600080fd5b5061036d61081b366004612c56565b611997565b34801561082c57600080fd5b5061034361083b366004612c56565b601b6020526000908152604090205460ff1681565b34801561085c57600080fd5b5061034361086b366004612cf2565b6119cb565b34801561087c57600080fd5b506103d261088b366004612a18565b6119f6565b34801561089c57600080fd5b5061036d611a73565b3480156108b157600080fd5b506103436108c0366004612a59565b611a9b565b3480156108d157600080fd5b50601d546001600160a01b03163314610343565b3480156108f157600080fd5b506103d2610900366004612a18565b611b7d565b34801561091157600080fd5b50610424610920366004612c56565b5060015490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109ba57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60208054610a1990612f18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590612f18565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b505050505081565b6000610aa582611c61565b610ae45760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b60448201526064015b60405180910390fd5b506000908152600f60205260409020546001600160a01b031690565b6000610b0b82611195565b9050806001600160a01b0316836001600160a01b03161415610b6f5760405162461bcd60e51b815260206004820152600d60248201527f63757272656e74206f776e6572000000000000000000000000000000000000006044820152606401610adb565b336001600160a01b0382161480610b8b5750610b8b8133611a9b565b610bc65760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b610bd08383611cae565b505050565b601c5461010090046001600160a01b03163314610c345760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19169055565b610c5d3382611d29565b610c985760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b610bd0838383611dcc565b6002601f541415610cf65760405162461bcd60e51b815260206004820152600e60248201527f5265656e7472616e742063616c6c0000000000000000000000000000000000006044820152606401610adb565b6002601f556000610d0647611333565b9050600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d909190612a3c565b6001600160a01b031663c1cbbca782836040518363ffffffff1660e01b8152600401610dbe91815260200190565b6000604051808303818588803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b5050600754610e0893506001600160a01b03169150479050611f7c565b506001601f55565b601e54600090600160a01b900460ff1615610e6d5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610adb565b6001600160a01b03821660009081526011602052604090205460ff1615610ed65760405162461bcd60e51b815260206004820152601160248201527f616c7265616479207075726368617365640000000000000000000000000000006044820152606401610adb565b600454341015610f285760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610adb565b601754600254610f389190612e8a565b90506003548110610f8b5760405162461bcd60e51b815260206004820152600860248201527f736f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610adb565b6001600160a01b0382166000908152601160205260409020805460ff19166001179055610fb8828261206f565b604080513481523360208201526001600160a01b03841681830152905182917fd0583f52c821a4947b04f05eab604fc1b04ba8daad41e9f2fd2d69cf3fc1a56a919081900360600190a26001601760008282546110159190612e8a565b909155509092915050565b601c5461010090046001600160a01b03163314806110485750601e546001600160a01b031633145b6110945760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b80516110a7906000906020840190612909565b5050565b601c5461010090046001600160a01b03163314806110d35750601e546001600160a01b031633145b61111f5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b6111276121af565b565b610bd083838360405180602001604052806000815250611940565b61114e3382611d29565b6111895760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b61119281612266565b50565b60006002548210156112cd5760165482106111e05760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000828152600c602052604090205460ff161561122d5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000828152600d60205260409020546001600160a01b03161561126657506000908152600d60205260409020546001600160a01b031690565b6000805b6015548110156112ca576000818152601960209081526040808320546001600160a01b0316808452601a909252909120546112a59084612e8a565b9250828510156112b757949350505050565b50806112c281612f53565b91505061126a565b50505b506000818152600d60205260409020546001600160a01b0316806113215760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b919050565b60008054610a1990612f18565b6000612710826008546113469190612eb6565b610a069190612ea2565b60006001600160a01b0382166113a85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b506001600160a01b03166000908152600e602052604090205490565b601c5461010090046001600160a01b031633146114235760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b611127612342565b601d546001600160a01b031633146114ab5760405162461bcd60e51b815260206004820152602c60248201527f63757272656e74206f776e6572206d757374207365742063616c6c657220617360448201527f206e657874206f776e65722e00000000000000000000000000000000000000006064820152608401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19169055601c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010033818102929092179283905560405191926001600160a01b0391900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3565b601c5461010090046001600160a01b031633148061155f5750601e546001600160a01b031633145b6115ab5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b6111276123a8565b60218054610a1990612f18565b6001600160a01b0382163314156116195760405162461bcd60e51b815260206004820152601160248201527f617070726f766520746f2063616c6c65720000000000000000000000000000006044820152606401610adb565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b346116908686612eb6565b11156116de5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610adb565b6116e883876119cb565b156117355760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920636c61696d656400000000000000000000000000000000006044820152606401610adb565b61173f8387612460565b6117ce828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040805160608d901b6bffffffffffffffffffffffff1916602080830191909152603482018d9052605482018c905260748083018c905283518084039091018152609490920190925280519101209092509050612493565b61181a5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610adb565b601580546000908152601960205260408120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a1617905581546001929190611864908490612e8a565b90915550506001600160a01b0386166000908152601a6020526040812086905560168054879290611896908490612e8a565b90915550506001600160a01b0386166000908152600e6020526040812080548792906118c3908490612e8a565b9091555050600a546001600160a01b038716906000907fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d60016119068a84612e8a565b6119109190612ed5565b60405190815260200160405180910390a484600a60008282546119339190612e8a565b9091555050505050505050565b61194a3383611d29565b6119855760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b61199184848484612542565b50505050565b606060006119a4836125a5565b6040516020016119b5929190612ddd565b6040516020818303038152906040529050919050565b6000601b60006119db85856126d7565b815260208101919091526040016000205460ff169392505050565b601c5461010090046001600160a01b0316331480611a1e5750601e546001600160a01b031633145b611a6a5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b61119281612725565b60606000604051602001611a879190612e02565b604051602081830303815290604052905090565b6012546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000928482169291169063c45527919060240160206040518083038186803b158015611aff57600080fd5b505afa158015611b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b379190612a3c565b6001600160a01b03161415611b4e57506001610a06565b506001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b601c5461010090046001600160a01b03163314611bdc5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b6001600160a01b038116611c325760405162461bcd60e51b815260206004820152601f60248201527f4e657874206f776e657220697320746865207a65726f20616464726573732e006044820152606401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600060025482108015611c8357506000828152600c602052604090205460ff16155b15611c9057506001919050565b506000908152600d60205260409020546001600160a01b0316151590565b6000818152600f60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611cf082611195565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d3482611c61565b611d6e5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000611d7983611195565b9050806001600160a01b0316846001600160a01b03161480611db45750836001600160a01b0316611da984610a9a565b6001600160a01b0316145b80611dc45750611dc48185611a9b565b949350505050565b826001600160a01b0316611ddf82611195565b6001600160a01b031614611e355760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e206e6f74206f776e656400000000000000000000000000000000006044820152606401610adb565b6001600160a01b038216611e8b5760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b611e96600082611cae565b6001600160a01b0383166000908152600e602052604090205415611ee3576001600160a01b0383166000908152600e60205260408120805460019290611edd908490612ed5565b90915550505b6000818152600d60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091558352600e9091528120805460019290611f37908490612e8a565b909155505060405181906001600160a01b0380851691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b80471015611fcc5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610adb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612019576040519150601f19603f3d011682016040523d82523d6000602084013e61201e565b606091505b5050905080610bd05760405162461bcd60e51b815260206004820152601260248201527f726563697069656e7420726576657274656400000000000000000000000000006044820152606401610adb565b6001600160a01b0382166120c55760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b6120ce81611c61565b1561211b5760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610adb565b6001600160a01b0382166000908152600e60205260408120805460019290612144908490612e8a565b90915550506000818152600d6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b601e54600160a01b900460ff166122085760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610adb565b601e80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600061227182611195565b905061227e600083611cae565b6001600160a01b0381166000908152600e6020526040902054156122cb576001600160a01b0381166000908152600e602052604081208054600192906122c5908490612ed5565b90915550505b6000828152600d60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169055600c909152808220805460ff19166001179055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b601c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169081905560405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b601e54600160a01b900460ff16156124025760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610adb565b601e80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161225c565b6001601b600061247085856126d7565b81526020810191909152604001600020805460ff19169115159190911790555050565b600081815b85518110156125375760008682815181106124b5576124b5612fae565b602002602001015190508083116124f7576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612524565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252f81612f53565b915050612498565b509092149392505050565b61254d848484611dcc565b6125598484848461278e565b6119915760405162461bcd60e51b815260206004820152601260248201527f6e6f6e20455243373231526563656976657200000000000000000000000000006044820152606401610adb565b6060816125e557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561260f57806125f981612f53565b91506126089050600a83612ea2565b91506125e9565b60008167ffffffffffffffff81111561262a5761262a612fc4565b6040519080825280601f01601f191660200182016040528015612654576020820181803683370190505b5090505b8415611dc457612669600183612ed5565b9150612676600a86612f6e565b612681906030612e8a565b60f81b81838151811061269657612696612fae565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126d0600a86612ea2565b9450612658565b6000828260405160200161270792919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b601e546040516001600160a01b038084169216907fde4b3f61490b74c0ed6237523974fe299126bbbf8a8a7482fd220104c59b0c8490600090a3601e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000833b15612901576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127e2903390899088908890600401612e3b565b602060405180830381600087803b1580156127fc57600080fd5b505af192505050801561282c575060408051601f3d908101601f1916820190925261282991810190612c8c565b60015b6128b6573d80801561285a576040519150601f19603f3d011682016040523d82523d6000602084013e61285f565b606091505b5080516128ae5760405162461bcd60e51b815260206004820152601260248201527f6e6f6e20455243373231526563656976657200000000000000000000000000006044820152606401610adb565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611dc4565b506001611dc4565b82805461291590612f18565b90600052602060002090601f016020900481019282612937576000855561297d565b82601f1061295057805160ff191683800117855561297d565b8280016001018555821561297d579182015b8281111561297d578251825591602001919060010190612962565b5061298992915061298d565b5090565b5b80821115612989576000815560010161298e565b600067ffffffffffffffff808411156129bd576129bd612fc4565b604051601f8501601f19908116603f011681019082821181831017156129e5576129e5612fc4565b816040528093508581528686860111156129fe57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a2a57600080fd5b8135612a3581612fda565b9392505050565b600060208284031215612a4e57600080fd5b8151612a3581612fda565b60008060408385031215612a6c57600080fd5b8235612a7781612fda565b91506020830135612a8781612fda565b809150509250929050565b600080600060608486031215612aa757600080fd5b8335612ab281612fda565b92506020840135612ac281612fda565b929592945050506040919091013590565b60008060008060808587031215612ae957600080fd5b8435612af481612fda565b93506020850135612b0481612fda565b925060408501359150606085013567ffffffffffffffff811115612b2757600080fd5b8501601f81018713612b3857600080fd5b612b47878235602084016129a2565b91505092959194509250565b60008060408385031215612b6657600080fd5b8235612b7181612fda565b915060208301358015158114612a8757600080fd5b60008060408385031215612b9957600080fd5b8235612ba481612fda565b946020939093013593505050565b60008060008060008060a08789031215612bcb57600080fd5b8635612bd681612fda565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115612c0857600080fd5b818901915089601f830112612c1c57600080fd5b813581811115612c2b57600080fd5b8a60208260051b8501011115612c4057600080fd5b6020830194508093505050509295509295509295565b600060208284031215612c6857600080fd5b5035919050565b600060208284031215612c8157600080fd5b8135612a3581612fef565b600060208284031215612c9e57600080fd5b8151612a3581612fef565b600060208284031215612cbb57600080fd5b813567ffffffffffffffff811115612cd257600080fd5b8201601f81018413612ce357600080fd5b611dc4848235602084016129a2565b60008060408385031215612d0557600080fd5b823591506020830135612a8781612fda565b60008151808452612d2f816020860160208601612eec565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612d5d57607f831692505b6020808410821415612d7f57634e487b7160e01b600052602260045260246000fd5b818015612d935760018114612da457612dd1565b60ff19861689528489019650612dd1565b60008881526020902060005b86811015612dc95781548b820152908501908301612db0565b505084890196505b50505050505092915050565b6000612de98285612d43565b8351612df9818360208801612eec565b01949350505050565b6000612e0e8284612d43565b7f6d6574616461746100000000000000000000000000000000000000000000000081526008019392505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612e6d6080830184612d17565b9695505050505050565b602081526000612a356020830184612d17565b60008219821115612e9d57612e9d612f82565b500190565b600082612eb157612eb1612f98565b500490565b6000816000190483118215151615612ed057612ed0612f82565b500290565b600082821015612ee757612ee7612f82565b500390565b60005b83811015612f07578181015183820152602001612eef565b838111156119915750506000910152565b600181811c90821680612f2c57607f821691505b60208210811415612f4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f6757612f67612f82565b5060010190565b600082612f7d57612f7d612f98565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461119257600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461119257600080fdfea2646970667358221220f6b5490c616fd26acc43cc2fd9e06775384f8148659b4c525e79321b926b93db64736f6c634300080600330000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b570000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x60806040526004361061031e5760003560e01c80636c0360eb116101a5578063af63ff5d116100ec578063d2ef079511610095578063e985e9c51161006f578063e985e9c5146108a5578063ed459df2146108c5578063f2fde38b146108e5578063ffbdc8cb1461090557600080fd5b8063d2ef079514610850578063e4c0aaf414610870578063e8a3d4851461089057600080fd5b8063c7af3352116100c6578063c7af3352146107e0578063c87b56dd14610800578063cc3c0f061461082057600080fd5b8063af63ff5d1461078d578063b50cbd9f146107a0578063b88d4fde146107c057600080fd5b806388a17bde1161014e57806395d89b411161012857806395d89b4114610742578063a035b1fe14610757578063a22cb4651461076d57600080fd5b806388a17bde146106e25780638da5cb5b146106f85780638f32d59b1461071d57600080fd5b8063715018a61161017f578063715018a6146106a357806379ba5097146106b85780638456cb59146106cd57600080fd5b80636c0360eb1461064e5780636c8526571461066357806370a082311461068357600080fd5b806324600fc31161026957806342842e0e116102125780635c975abb116101ec5780635c975abb146105d75780636352211e146105f85780636bc177e81461061857600080fd5b806342842e0e1461057757806342966c6814610597578063570ca735146105b757600080fd5b80632eb4a7ab116102435780632eb4a7ab1461052c57806339a0c6f9146105425780633f4ba83a1461056257600080fd5b806324600fc3146104e457806325b31a97146104f95780632704f9b41461050c57600080fd5b806317fc45e2116102cb57806323250cae116102a557806323250cae1461047f57806323452b9c146104af57806323b872dd146104c457600080fd5b806317fc45e21461040e5780631a5b6279146104325780631bb534ba1461045f57600080fd5b8063095ea7b3116102fc578063095ea7b3146103b2578063099ea2d3146103d45780630c340a24146103ee57600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004612c6f565b610927565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610a0c565b60405161034f9190612e77565b34801561038657600080fd5b5061039a610395366004612c56565b610a9a565b6040516001600160a01b03909116815260200161034f565b3480156103be57600080fd5b506103d26103cd366004612b86565b610b00565b005b3480156103e057600080fd5b50601c546103439060ff1681565b3480156103fa57600080fd5b50601e5461039a906001600160a01b031681565b34801561041a57600080fd5b5061042460035481565b60405190815260200161034f565b34801561043e57600080fd5b5061042461044d366004612a18565b601a6020526000908152604090205481565b34801561046b57600080fd5b5060075461039a906001600160a01b031681565b34801561048b57600080fd5b5061034361049a366004612c56565b60186020526000908152604090205460ff1681565b3480156104bb57600080fd5b506103d2610bd5565b3480156104d057600080fd5b506103d26104df366004612a92565b610c53565b3480156104f057600080fd5b506103d2610ca3565b610424610507366004612a18565b610e10565b34801561051857600080fd5b5060065461039a906001600160a01b031681565b34801561053857600080fd5b5061042460135481565b34801561054e57600080fd5b506103d261055d366004612ca9565b611020565b34801561056e57600080fd5b506103d26110ab565b34801561058357600080fd5b506103d2610592366004612a92565b611129565b3480156105a357600080fd5b506103d26105b2366004612c56565b611144565b3480156105c357600080fd5b5060055461039a906001600160a01b031681565b3480156105e357600080fd5b50601e5461034390600160a01b900460ff1681565b34801561060457600080fd5b5061039a610613366004612c56565b611195565b34801561062457600080fd5b5061039a610633366004612c56565b6019602052600090815260409020546001600160a01b031681565b34801561065a57600080fd5b5061036d611326565b34801561066f57600080fd5b5061042461067e366004612c56565b611333565b34801561068f57600080fd5b5061042461069e366004612a18565b611350565b3480156106af57600080fd5b506103d26113c4565b3480156106c457600080fd5b506103d261142b565b3480156106d957600080fd5b506103d2611537565b3480156106ee57600080fd5b5061042460025481565b34801561070457600080fd5b50601c5461039a9061010090046001600160a01b031681565b34801561072957600080fd5b50601c5461010090046001600160a01b03163314610343565b34801561074e57600080fd5b5061036d6115b3565b34801561076357600080fd5b5061042460045481565b34801561077957600080fd5b506103d2610788366004612b53565b6115c0565b6103d261079b366004612bb2565b611685565b3480156107ac57600080fd5b5060125461039a906001600160a01b031681565b3480156107cc57600080fd5b506103d26107db366004612ad3565b611940565b3480156107ec57600080fd5b50601e546001600160a01b03163314610343565b34801561080c57600080fd5b5061036d61081b366004612c56565b611997565b34801561082c57600080fd5b5061034361083b366004612c56565b601b6020526000908152604090205460ff1681565b34801561085c57600080fd5b5061034361086b366004612cf2565b6119cb565b34801561087c57600080fd5b506103d261088b366004612a18565b6119f6565b34801561089c57600080fd5b5061036d611a73565b3480156108b157600080fd5b506103436108c0366004612a59565b611a9b565b3480156108d157600080fd5b50601d546001600160a01b03163314610343565b3480156108f157600080fd5b506103d2610900366004612a18565b611b7d565b34801561091157600080fd5b50610424610920366004612c56565b5060015490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806109ba57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60208054610a1990612f18565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4590612f18565b8015610a925780601f10610a6757610100808354040283529160200191610a92565b820191906000526020600020905b815481529060010190602001808311610a7557829003601f168201915b505050505081565b6000610aa582611c61565b610ae45760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b60448201526064015b60405180910390fd5b506000908152600f60205260409020546001600160a01b031690565b6000610b0b82611195565b9050806001600160a01b0316836001600160a01b03161415610b6f5760405162461bcd60e51b815260206004820152600d60248201527f63757272656e74206f776e6572000000000000000000000000000000000000006044820152606401610adb565b336001600160a01b0382161480610b8b5750610b8b8133611a9b565b610bc65760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b610bd08383611cae565b505050565b601c5461010090046001600160a01b03163314610c345760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19169055565b610c5d3382611d29565b610c985760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b610bd0838383611dcc565b6002601f541415610cf65760405162461bcd60e51b815260206004820152600e60248201527f5265656e7472616e742063616c6c0000000000000000000000000000000000006044820152606401610adb565b6002601f556000610d0647611333565b9050600960009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d5857600080fd5b505af1158015610d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d909190612a3c565b6001600160a01b031663c1cbbca782836040518363ffffffff1660e01b8152600401610dbe91815260200190565b6000604051808303818588803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b5050600754610e0893506001600160a01b03169150479050611f7c565b506001601f55565b601e54600090600160a01b900460ff1615610e6d5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610adb565b6001600160a01b03821660009081526011602052604090205460ff1615610ed65760405162461bcd60e51b815260206004820152601160248201527f616c7265616479207075726368617365640000000000000000000000000000006044820152606401610adb565b600454341015610f285760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610adb565b601754600254610f389190612e8a565b90506003548110610f8b5760405162461bcd60e51b815260206004820152600860248201527f736f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610adb565b6001600160a01b0382166000908152601160205260409020805460ff19166001179055610fb8828261206f565b604080513481523360208201526001600160a01b03841681830152905182917fd0583f52c821a4947b04f05eab604fc1b04ba8daad41e9f2fd2d69cf3fc1a56a919081900360600190a26001601760008282546110159190612e8a565b909155509092915050565b601c5461010090046001600160a01b03163314806110485750601e546001600160a01b031633145b6110945760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b80516110a7906000906020840190612909565b5050565b601c5461010090046001600160a01b03163314806110d35750601e546001600160a01b031633145b61111f5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b6111276121af565b565b610bd083838360405180602001604052806000815250611940565b61114e3382611d29565b6111895760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b61119281612266565b50565b60006002548210156112cd5760165482106111e05760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000828152600c602052604090205460ff161561122d5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000828152600d60205260409020546001600160a01b03161561126657506000908152600d60205260409020546001600160a01b031690565b6000805b6015548110156112ca576000818152601960209081526040808320546001600160a01b0316808452601a909252909120546112a59084612e8a565b9250828510156112b757949350505050565b50806112c281612f53565b91505061126a565b50505b506000818152600d60205260409020546001600160a01b0316806113215760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b919050565b60008054610a1990612f18565b6000612710826008546113469190612eb6565b610a069190612ea2565b60006001600160a01b0382166113a85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b506001600160a01b03166000908152600e602052604090205490565b601c5461010090046001600160a01b031633146114235760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b611127612342565b601d546001600160a01b031633146114ab5760405162461bcd60e51b815260206004820152602c60248201527f63757272656e74206f776e6572206d757374207365742063616c6c657220617360448201527f206e657874206f776e65722e00000000000000000000000000000000000000006064820152608401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19169055601c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010033818102929092179283905560405191926001600160a01b0391900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3565b601c5461010090046001600160a01b031633148061155f5750601e546001600160a01b031633145b6115ab5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b6111276123a8565b60218054610a1990612f18565b6001600160a01b0382163314156116195760405162461bcd60e51b815260206004820152601160248201527f617070726f766520746f2063616c6c65720000000000000000000000000000006044820152606401610adb565b3360008181526010602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b346116908686612eb6565b11156116de5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610adb565b6116e883876119cb565b156117355760405162461bcd60e51b815260206004820152600f60248201527f616c726561647920636c61696d656400000000000000000000000000000000006044820152606401610adb565b61173f8387612460565b6117ce828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506013546040805160608d901b6bffffffffffffffffffffffff1916602080830191909152603482018d9052605482018c905260748083018c905283518084039091018152609490920190925280519101209092509050612493565b61181a5760405162461bcd60e51b815260206004820152600d60248201527f696e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610adb565b601580546000908152601960205260408120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a1617905581546001929190611864908490612e8a565b90915550506001600160a01b0386166000908152601a6020526040812086905560168054879290611896908490612e8a565b90915550506001600160a01b0386166000908152600e6020526040812080548792906118c3908490612e8a565b9091555050600a546001600160a01b038716906000907fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d60016119068a84612e8a565b6119109190612ed5565b60405190815260200160405180910390a484600a60008282546119339190612e8a565b9091555050505050505050565b61194a3383611d29565b6119855760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606401610adb565b61199184848484612542565b50505050565b606060006119a4836125a5565b6040516020016119b5929190612ddd565b6040516020818303038152906040529050919050565b6000601b60006119db85856126d7565b815260208101919091526040016000205460ff169392505050565b601c5461010090046001600160a01b0316331480611a1e5750601e546001600160a01b031633145b611a6a5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420676f7665726e616e636500000000000000006044820152606401610adb565b61119281612725565b60606000604051602001611a879190612e02565b604051602081830303815290604052905090565b6012546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000928482169291169063c45527919060240160206040518083038186803b158015611aff57600080fd5b505afa158015611b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b379190612a3c565b6001600160a01b03161415611b4e57506001610a06565b506001600160a01b03918216600090815260106020908152604080832093909416825291909152205460ff1690565b601c5461010090046001600160a01b03163314611bdc5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206f776e65722e00000000000000006044820152606401610adb565b6001600160a01b038116611c325760405162461bcd60e51b815260206004820152601f60248201527f4e657874206f776e657220697320746865207a65726f20616464726573732e006044820152606401610adb565b601d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600060025482108015611c8357506000828152600c602052604090205460ff16155b15611c9057506001919050565b506000908152600d60205260409020546001600160a01b0316151590565b6000818152600f60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611cf082611195565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d3482611c61565b611d6e5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606401610adb565b6000611d7983611195565b9050806001600160a01b0316846001600160a01b03161480611db45750836001600160a01b0316611da984610a9a565b6001600160a01b0316145b80611dc45750611dc48185611a9b565b949350505050565b826001600160a01b0316611ddf82611195565b6001600160a01b031614611e355760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e206e6f74206f776e656400000000000000000000000000000000006044820152606401610adb565b6001600160a01b038216611e8b5760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b611e96600082611cae565b6001600160a01b0383166000908152600e602052604090205415611ee3576001600160a01b0383166000908152600e60205260408120805460019290611edd908490612ed5565b90915550505b6000818152600d60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091558352600e9091528120805460019290611f37908490612e8a565b909155505060405181906001600160a01b0380851691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b80471015611fcc5760405162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610adb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612019576040519150601f19603f3d011682016040523d82523d6000602084013e61201e565b606091505b5050905080610bd05760405162461bcd60e51b815260206004820152601260248201527f726563697069656e7420726576657274656400000000000000000000000000006044820152606401610adb565b6001600160a01b0382166120c55760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610adb565b6120ce81611c61565b1561211b5760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610adb565b6001600160a01b0382166000908152600e60205260408120805460019290612144908490612e8a565b90915550506000818152600d6020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b601e54600160a01b900460ff166122085760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610adb565b601e80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600061227182611195565b905061227e600083611cae565b6001600160a01b0381166000908152600e6020526040902054156122cb576001600160a01b0381166000908152600e602052604081208054600192906122c5908490612ed5565b90915550505b6000828152600d60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169055600c909152808220805460ff19166001179055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b601c80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169081905560405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b601e54600160a01b900460ff16156124025760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610adb565b601e80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161225c565b6001601b600061247085856126d7565b81526020810191909152604001600020805460ff19169115159190911790555050565b600081815b85518110156125375760008682815181106124b5576124b5612fae565b602002602001015190508083116124f7576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612524565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252f81612f53565b915050612498565b509092149392505050565b61254d848484611dcc565b6125598484848461278e565b6119915760405162461bcd60e51b815260206004820152601260248201527f6e6f6e20455243373231526563656976657200000000000000000000000000006044820152606401610adb565b6060816125e557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561260f57806125f981612f53565b91506126089050600a83612ea2565b91506125e9565b60008167ffffffffffffffff81111561262a5761262a612fc4565b6040519080825280601f01601f191660200182016040528015612654576020820181803683370190505b5090505b8415611dc457612669600183612ed5565b9150612676600a86612f6e565b612681906030612e8a565b60f81b81838151811061269657612696612fae565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506126d0600a86612ea2565b9450612658565b6000828260405160200161270792919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b601e546040516001600160a01b038084169216907fde4b3f61490b74c0ed6237523974fe299126bbbf8a8a7482fd220104c59b0c8490600090a3601e805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000833b15612901576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906127e2903390899088908890600401612e3b565b602060405180830381600087803b1580156127fc57600080fd5b505af192505050801561282c575060408051601f3d908101601f1916820190925261282991810190612c8c565b60015b6128b6573d80801561285a576040519150601f19603f3d011682016040523d82523d6000602084013e61285f565b606091505b5080516128ae5760405162461bcd60e51b815260206004820152601260248201527f6e6f6e20455243373231526563656976657200000000000000000000000000006044820152606401610adb565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611dc4565b506001611dc4565b82805461291590612f18565b90600052602060002090601f016020900481019282612937576000855561297d565b82601f1061295057805160ff191683800117855561297d565b8280016001018555821561297d579182015b8281111561297d578251825591602001919060010190612962565b5061298992915061298d565b5090565b5b80821115612989576000815560010161298e565b600067ffffffffffffffff808411156129bd576129bd612fc4565b604051601f8501601f19908116603f011681019082821181831017156129e5576129e5612fc4565b816040528093508581528686860111156129fe57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612a2a57600080fd5b8135612a3581612fda565b9392505050565b600060208284031215612a4e57600080fd5b8151612a3581612fda565b60008060408385031215612a6c57600080fd5b8235612a7781612fda565b91506020830135612a8781612fda565b809150509250929050565b600080600060608486031215612aa757600080fd5b8335612ab281612fda565b92506020840135612ac281612fda565b929592945050506040919091013590565b60008060008060808587031215612ae957600080fd5b8435612af481612fda565b93506020850135612b0481612fda565b925060408501359150606085013567ffffffffffffffff811115612b2757600080fd5b8501601f81018713612b3857600080fd5b612b47878235602084016129a2565b91505092959194509250565b60008060408385031215612b6657600080fd5b8235612b7181612fda565b915060208301358015158114612a8757600080fd5b60008060408385031215612b9957600080fd5b8235612ba481612fda565b946020939093013593505050565b60008060008060008060a08789031215612bcb57600080fd5b8635612bd681612fda565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff80821115612c0857600080fd5b818901915089601f830112612c1c57600080fd5b813581811115612c2b57600080fd5b8a60208260051b8501011115612c4057600080fd5b6020830194508093505050509295509295509295565b600060208284031215612c6857600080fd5b5035919050565b600060208284031215612c8157600080fd5b8135612a3581612fef565b600060208284031215612c9e57600080fd5b8151612a3581612fef565b600060208284031215612cbb57600080fd5b813567ffffffffffffffff811115612cd257600080fd5b8201601f81018413612ce357600080fd5b611dc4848235602084016129a2565b60008060408385031215612d0557600080fd5b823591506020830135612a8781612fda565b60008151808452612d2f816020860160208601612eec565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612d5d57607f831692505b6020808410821415612d7f57634e487b7160e01b600052602260045260246000fd5b818015612d935760018114612da457612dd1565b60ff19861689528489019650612dd1565b60008881526020902060005b86811015612dc95781548b820152908501908301612db0565b505084890196505b50505050505092915050565b6000612de98285612d43565b8351612df9818360208801612eec565b01949350505050565b6000612e0e8284612d43565b7f6d6574616461746100000000000000000000000000000000000000000000000081526008019392505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612e6d6080830184612d17565b9695505050505050565b602081526000612a356020830184612d17565b60008219821115612e9d57612e9d612f82565b500190565b600082612eb157612eb1612f98565b500490565b6000816000190483118215151615612ed057612ed0612f82565b500290565b600082821015612ee757612ee7612f82565b500390565b60005b83811015612f07578181015183820152602001612eef565b838111156119915750506000910152565b600181811c90821680612f2c57607f821691505b60208210811415612f4d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f6757612f67612f82565b5060010190565b600082612f7d57612f7d612f98565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461119257600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461119257600080fdfea2646970667358221220f6b5490c616fd26acc43cc2fd9e06775384f8148659b4c525e79321b926b93db64736f6c63430008060033

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

0000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b570000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : owner_ (address): 0x2330ee705fFD040bB0cbA8CB7734Dfe00E7C4b57
Arg [1] : governor_ (address): 0x2330ee705fFD040bB0cbA8CB7734Dfe00E7C4b57
Arg [2] : proxyRegistry_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57
Arg [1] : 0000000000000000000000002330ee705ffd040bb0cba8cb7734dfe00e7c4b57
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


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

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.