ETH Price: $2,285.52 (-3.68%)

Contract

0x8CD834258d000166769733Dfb5fB6fD6E43dB4e7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...188220342023-12-19 19:20:35262 days ago1703013635IN
0x8CD83425...6E43dB4e7
0 ETH0.0029406463.69726779
Set Producer180591112023-09-03 23:02:11369 days ago1693782131IN
0x8CD83425...6E43dB4e7
0 ETH0.000290089.97487443
Release180458912023-09-02 2:33:59371 days ago1693622039IN
0x8CD83425...6E43dB4e7
0 ETH0.0012459411.37388114
Transfer180458862023-09-02 2:32:59371 days ago1693621979IN
0x8CD83425...6E43dB4e7
0.001 ETH0.0002540211.33802082
Transfer180458802023-09-02 2:31:47371 days ago1693621907IN
0x8CD83425...6E43dB4e7
0 ETH0.000224510.02010499
Advance Mint Tok...180458552023-09-02 2:26:35371 days ago1693621595IN
0x8CD83425...6E43dB4e7
0 ETH0.0014800510.84832004
Advance Mint Tok...180458342023-09-02 2:22:23371 days ago1693621343IN
0x8CD83425...6E43dB4e7
0 ETH0.0011621612.37210351
0x60e06040180458302023-09-02 2:21:35371 days ago1693621295IN
 Create: PixelPioneer
0 ETH0.0480407616.18446436

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
180458912023-09-02 2:33:59371 days ago1693622039
0x8CD83425...6E43dB4e7
0.001 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PixelPioneer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 29 : PixelPioneer.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

// OZ Libraries
import '@openzeppelin/contracts/access/Ownable.sol';

// Local References
import './PixelPioneerBase.sol';
import './PixelPioneerSplitsAndRoyalties.sol';

// Error Codes
error CallerIsNotOwner();

/**
 * @title PixelPioneer        .
 *                            .+.
 *             -:       .:    :+.
 *    --      :=.       :+    -=                                         .     ..                     .:-:
 *    .+.    --         :+    =-   .:.                                 :++-.  .++=: ..              :==:-++==:
 *     =-  .=:          :=    +.  -=::.:.               -.        .==..+=-+=  =+:+-.=====:         -+:  =+:.-+.
 *     =-:=-       :.   ==----+  :+   =+:.-+-   ..                 ++..++++:  =++=-+:   -+:      .++=--=++=-++.
 *     -=--==-.    :.   +-::.=-  +- .=-+:=::+. -+=     .:-.        =+.  .+=   :+=.=+:   -+:       +=:::=+..-+:
 *     --    .--       .+.  .+:  ==-=: -+:  ===:.======-::+-       =+.  :+:   =+:-+-   :+=       .+=  .+--+-.
 *     .-              .+.  :+.   :.                      :+.      .-    .    .-=-.    =+.        :==-=+=:.
 *                      +:  .+                            :-                           ..            ..
 *
 *                                                K. Haring 1987 ⊕︀
 *
 *
 * @dev                       Ascii art tribute to Keith Haring's distinctive signature
 * @dev          Thanks to Herman Schechkin for https://github.com/hermanTenuki/ASCII-Generator.site
 */
contract PixelPioneer is PixelPioneerSplitsAndRoyalties, PixelPioneerBase, Ownable {
    // NFT License path subject to change, see getContractURI() for latest file.
    string private constant NFT_LICENSE_URL = 'https://www.haring.com/!/nft-ownership-license';
    address private constant METADATA_CONTRACT = 0xCD17e53ceA841FF9bE6cFc99d285DB754A6175F1; // PixelPioneerMetadata V1

    constructor()
        ERC721('PixelPioneer', 'KH87')
        SafetyLatch(18253700) // Oct 1 2023
        PixelPioneerBase(NFT_LICENSE_URL)
        ChainNativeMetadataConsumer(METADATA_CONTRACT)
    {
        // Implementation version: v1.0.0
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return ERC721.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
    }

    /**
     * Fulfill isOwner() modifier implementation
     *
     * @dev see OwnableDeferred for more explanation on this.
     */
    modifier isOwner() override {
        _isOwner();
        _;
    }

    /**
     * Fulfill _isOwner() implementation, backed by OZ Ownable.
     *
     * @dev see OwnableDeferred for more explanation on this.
     */
    function _isOwner() internal view override(NFTCSplitsAndRoyalties, OwnableDeferral) {
        // Same as _checkOwner() but using error code instead of a require statement.
        if (owner() != _msgSender()) revert CallerIsNotOwner();
    }
}

File 2 of 29 : OwnableDeferral.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

/**
 * @title OwnableDeferral
 * @author @NiftyMike | @NFTCulture
 * @dev Implements checks for contract admin operations. Will be Backed by
 * OZ Ownable.
 *
 * This contract is helpful when a contract tree gets complicated,
 * and multiple contracts need to leverage Ownable.
 *
 * Sample Implementation:
 *
 * modifier isOwner() override(...) {
 *     _isOwner();
 *     _;
 * }
 *
 * function _isOwner() internal view override(...) {
 *     _checkOwner();
 * }
 */
abstract contract OwnableDeferral {
    modifier isOwner() virtual;

    function _isOwner() internal view virtual;
}

File 3 of 29 : SafetyLatch.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// Local References
import '../access/v2/OwnableDeferral.sol';

// Error Codes
error DestructRevoked();
error DestructExpired();

/**
 * @title SafetyLatch
 * @author @NFTCulture
 * @dev Utility class to fulfill "killswitch" requirements from business people.
 * I named it "SafetyLatch" just be less negative. The intent of this class is to
 * prevent screw-ups and not to be used nefariously.
 *
 * KillSwitch is set to expire on either of the following conditions:
 *      1) A preconfigured block timestamp passes.
 *      2) If it is voluntarily released by the owner.
 *
 * Call canDestruct() to see if the window has closed.
 *
 * Implementing contract must actually perform whatever logic needs to be done on destruct.
 */
abstract contract SafetyLatch is OwnableDeferral {
    uint256 private immutable DESTRUCT_WINDOW_ENDS_AT;
    bool private REVOKE_DESTRUCT = false;

    constructor(uint256 windowEndBlock) {
        DESTRUCT_WINDOW_ENDS_AT = windowEndBlock;
    }

    function destructContract() external isOwner {
        if (REVOKE_DESTRUCT) revert DestructRevoked();
        if (block.number >= DESTRUCT_WINDOW_ENDS_AT) revert DestructExpired();

        _executeOnDestruct();
    }

    function revokeDestruct() external isOwner {
        REVOKE_DESTRUCT = true;
    }

    function canDestruct() external view returns (bool) {
        if (REVOKE_DESTRUCT || block.number >= DESTRUCT_WINDOW_ENDS_AT) {
            return false;
        }

        return true;
    }

    function _executeOnDestruct() internal virtual;
}

File 4 of 29 : ChainNativeMetadataConsumer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// Local References
import '../../access/v2/OwnableDeferral.sol';
import './interfaces/IChainNativeMetadataProducer.sol';

/**
 * @title ChainNativeMetadataConsumer
 * @author @NiftyMike | @NFTCulture
 * @dev Basic implementation to manage connections to an external source for NFT metadata.
 */
abstract contract ChainNativeMetadataConsumer is OwnableDeferral {
    // External contract that manages the collection's metadata in a chain-native way.
    IChainNativeMetadataProducer private _metadataProducer;

    constructor(address __metadataProducer) {
        _setProducer(__metadataProducer);
    }

    /**
     * @notice Set the on-chain metadata producer contract.
     * Can only be called if caller is owner.
     *
     * @param __metadataProducer address of the producer contract.
     */
    function setProducer(address __metadataProducer) external isOwner {
        _setProducer(__metadataProducer);
    }

    function _setProducer(address __metadataProducer) internal {
        if (__metadataProducer != address(0)) {
            _metadataProducer = IChainNativeMetadataProducer(__metadataProducer);
        }
    }

    function _getProducer() internal view virtual returns (IChainNativeMetadataProducer) {
        return _metadataProducer;
    }
}

File 5 of 29 : IChainNativeMetadataProducer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

/**
 * @title IChainNativeMetadataProducer
 * @author @NiftyMike | @NFTCulture
 * @dev Super thin interface definition for a contract that
 * produces metadata in a chain native way.
 */
interface IChainNativeMetadataProducer {
    function getTokenTypeForToken(uint256 tokenId) external view returns (uint256);

    function getJsonAsString(uint256 tokenId, uint256 tokenType) external view returns (string memory);

    function getJsonAsEncodedString(uint256 tokenId, uint256 tokenType) external view returns (string memory);
}

File 6 of 29 : ERC721SolBase_NFTC.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// ERC721 from Sol-DAO/solbase, Packaged within NFTC Open Source Libraries.
// See: https://github.com/NFTCulture/nftc-contracts/blob/main/contracts/token/solbase/ERC721/ERC721.sol
import '@nftculture/nftc-contracts/contracts/token/solbase/ERC721/extensions/ERC721SolBaseBurnable.sol';
import '@nftculture/nftc-contracts/contracts/token/solbase/ERC721/extensions/ERC721SolBaseSupply.sol';

// ClosedSea by Vectorized
import 'closedsea/src/OperatorFilterer.sol';

// OZ Libraries
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Strings.sol';

// NFTC Prerelease Contracts
import '../../access/v2/OwnableDeferral.sol';
import './interfaces/INFTCAdvanceMint.sol';

/**
 * @title  ERC721SolBase_NFTC
 * @author @NFTCulture
 * @dev SolBase/ERC721 plus NFTC-preferred extensions and add-ons.
 *  - ERC721SolBaseBurnable
 *  - Ownable
 *  - OperatorFilterer
 *  - INFTCAdvanceMint: The NFTC Advance Mint API, which includes Base URI Management
 *    and Query Helpers
 *
 * Using implementation and approach created by Vectorized for OperatorFilterer.
 * See: https://github.com/Vectorized/closedsea/blob/main/src/example/ExampleERC721A.sol
 *
 * @notice Be sure to add the following to your impl constructor:
 * >>  _registerForOperatorFiltering();
 * >>  operatorFilteringEnabled = true;
 */
abstract contract ERC721SolBase_NFTC is ERC721SolBaseBurnable, OperatorFilterer, OwnableDeferral, INFTCAdvanceMint {
    using Strings for uint256;

    uint64 public immutable MAX_SUPPLY;

    string public baseURI;

    bool public operatorFilteringEnabled;

    constructor(uint64 __maxSupply, string memory __baseURI) {
        MAX_SUPPLY = __maxSupply;
        baseURI = __baseURI;
    }

    function setContractURI(string memory __baseURI) external isOwner {
        baseURI = __baseURI;
    }

    function getContractURI() external view override returns (string memory) {
        return _getContractURI();
    }

    function _getContractURI() internal view returns (string memory) {
        return baseURI;
    }

    function maxSupply() external view override returns (uint256) {
        return _maxSupply();
    }

    function _maxSupply() internal view returns (uint256) {
        return MAX_SUPPLY;
    }

    function balanceOwnedBy(address tokenOwner) external view override returns (uint256) {
        return super.balanceOf(tokenOwner);
    }

    function setApprovalForAll(
        address operator,
        bool approved
    ) public override(ERC721) onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override(ERC721) onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        ERC721SolBaseSupply.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override(ERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) public override(ERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    /**
     * Failsafe in case we need to turn operator filtering off.
     */
    function setOperatorFilteringEnabled(bool value) external isOwner {
        operatorFilteringEnabled = value;
    }

    /**
     * Failsafe in case we need to change what subscription we are using, for whatever reason.
     */
    function registerForOperatorFiltering(address subscription, bool subscribe) external isOwner {
        _registerForOperatorFiltering(subscription, subscribe);
    }

    function _operatorFilteringEnabled() internal view virtual override returns (bool) {
        return operatorFilteringEnabled;
    }

    function _isPriorityOperator(address operator) internal pure override returns (bool) {
        // OpenSea Seaport Conduit:
        // https://etherscan.io/address/0x1E0049783F008A0085193E00003D00cd54003c71
        // https://goerli.etherscan.io/address/0x1E0049783F008A0085193E00003D00cd54003c71
        return operator == address(0x1E0049783F008A0085193E00003D00cd54003c71);
    }

    function _tokenFilename(uint256 tokenId) internal pure virtual returns (string memory) {
        return tokenId.toString();
    }
}

File 7 of 29 : IBaseURIConfigurable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

/**
 * @title IBaseURIConfigurable
 * @author @NFTCulture
 * @dev Interface to define Base URI configuration functions.
 *
 * Supported Contract Specs:
 *  - ERC721A Static
 *  - ERC721A Expandable
 *  - ERC1155
 */
interface IBaseURIConfigurable {
    /*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\
    |                   API - General Functions                   |
    \____________________________________________________________*/

    // Set URI at the contract level. ERC721 - Base URI. ERC1155 - Uri.
    function setContractURI(string memory) external;

    // Get URI configured at the contract level. ERC721 - Base URI. ERC1155 - Uri.
    function getContractURI() external view returns (string memory);
}

File 8 of 29 : INFTCAdvanceMint.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// NFTC Prerelease Contracts
import './IBaseURIConfigurable.sol';
import './INonFungibleTokenQueryable.sol';

/**
 * @title INFTCAdvanceMint
 * @author @NFTCulture
 * @dev Interface to define standardized functionality that should be exposed
 * on NFTC Nifty contracts. This interface is tailored towards NFTs that are minted
 * in advance and then delivered to recipients via some to-be-determined mechanism.
 *
 * Supported Contract Specs:
 *  - ERC721SolBase
 *  - ERC721A Static
 *  - ERC721A Expandable
 *  - ERC1155
 */
interface INFTCAdvanceMint is IBaseURIConfigurable, INonFungibleTokenQueryable {
    // Tag Interface
}

File 9 of 29 : INonFungibleTokenQueryable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

/**
 * @title INonFungibleTokenQueryable
 * @author @NFTCulture
 * @dev Interface to define data-retrieval functions for a NonFungible Token contract.
 */
interface INonFungibleTokenQueryable {
    /*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°\
    |                   API - General Functions                   |
    \____________________________________________________________*/

    // Return the maximum possible number of tokens that can be minted by this contract.
    function maxSupply() external view returns (uint256);

    // Return the current number of tokens that exist.
    function totalTokensExist() external view returns (uint256);

    // Return the balance owned by an address.
    function balanceOwnedBy(address) external view returns (uint256);
}

File 10 of 29 : ERC2981_NFTCExtended.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/common/ERC2981.sol';

/**
 * @title ERC2981_NFTCExtended
 * @author @NiftyMike | @NFTCulture
 * @dev A wrapper around ERC2981 which adds some common functionality.
 */
abstract contract ERC2981_NFTCExtended is ERC2981 {
    function setDefaultRoyalty(address newReceiver, uint96 newRoyalty) external {
        _isOwner();

        _setDefaultRoyalty(newReceiver, newRoyalty);
    }

    function _isOwner() internal view virtual;
}

File 11 of 29 : NFTCPaymentSplitter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// NFTC Open Source Contracts See: https://github.com/NFTCulture/nftc-contracts
import './NFTCPaymentSplitterBase.sol';

/**
 * @title NFTCPaymentSplitter
 * @author @NiftyMike | @NFTCulture
 * @dev NFTC's Implementation of a Payment Splitter
 *
 * Underlying is based on OpenZeppelin Contracts v4.8.0 (finance/PaymentSplitter.sol)
 */
abstract contract NFTCPaymentSplitter is NFTCPaymentSplitterBase {
    /**
     * @dev Overrides release() method, so that it can only be called by owner.
     * @notice Owner: Release funds to a specific address.
     *
     * @param account Payable address that will receive funds.
     */
    function release(address payable account) public override {
        _isOwner();

        _release(account);
    }

    /**
     * @dev Triggers a transfer to caller's address of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     * @notice Sender: request payment.
     */
    function releaseToSelf() public {
        _release(payable(_msgSender()));
    }

    function _isOwner() internal view virtual;
}

File 12 of 29 : NFTCPaymentSplitterBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';

/**
 * @title NFTCPaymentSplitterBase
 * @author @NiftyMike | @NFTCulture
 * @dev An opinionated replacement of OZ's Payment Splitter.
 *
 * Notes:
 *  - Based on OZ Contracts v4.8.0 (finance/PaymentSplitter.sol)
 *  - ERC-20 token functionality removed to save gas.
 *  - Transferability of Payees, but only by Payee
 *  - Some require messages are shortened.
 *  - contract changed to abstract and release() functionality moved to internal method.
 *
 * IMPORTANT: changes to release() require higher level classes to expose release() in order
 * for funds to be withdrawn. This allows higher level classes to enforce better controls.
 */
abstract contract NFTCPaymentSplitterBase is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);
    event PayeeTransferred(address oldOwner, address newOwner);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, 'PaymentSplitter: length mismatch');
        require(payees.length > 0, 'PaymentSplitter: no payees');

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Getter for the amount of payee's releasable Ether.
     */
    function releasable(address account) public view returns (uint256) {
        return _releasable(account);
    }

    function _releasable(address account) internal view returns (uint256) {
        uint256 totalReceived = address(this).balance + totalReleased();
        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function _release(address payable account) internal {
        require(_shares[account] > 0, 'PaymentSplitter: no shares');

        uint256 payment = _releasable(account);

        require(payment != 0, 'PaymentSplitter: not due payment');

        // _totalReleased is the sum of all values in _released.
        // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow.
        _totalReleased += payment;
        unchecked {
            _released[account] += payment;
        }

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), 'PaymentSplitter: zero address');
        require(shares_ > 0, 'PaymentSplitter: no shares');
        require(_shares[account] == 0, 'PaymentSplitter: payee has shares');

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }

    /**
     * @dev Allows owner to transfer their shares to somebody else; it can only be called by of a share.
     * @notice Owner: Release funds to a specific address.
     *
     * @param newOwner Payable address which has no shares and will receive the shares of the current owner.
     */
    function transferPayee(address payable newOwner) public {
        require(newOwner != address(0), 'PaymentSplitter: zero address');
        require(_shares[_msgSender()] > 0, 'PaymentSplitter: no owned shares');
        require(_shares[newOwner] == 0, 'PaymentSplitter: payee has shares');

        _transferPayee(newOwner);
        emit PayeeTransferred(_msgSender(), newOwner);
    }

    function _transferPayee(address newOwner) private {
        if (_payees.length == 0) return;

        for (uint i = 0; i < _payees.length - 1; i++) {
            if (_payees[i] == _msgSender()) {
                _payees[i] = newOwner;
                _shares[newOwner] = _shares[_msgSender()];
                _shares[_msgSender()] = 0;
            }
        }
    }

    function release(address payable account) public virtual;
}

File 13 of 29 : NFTCSplitsAndRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// NFTC Open Source Contracts See: https://github.com/NFTCulture/nftc-contracts
import './ERC2981_NFTCExtended.sol';
import './NFTCPaymentSplitter.sol';

/**
 * @title NFTCSplitsAndRoyalties
 * @author @NiftyMike | @NFTCulture
 * @dev One stop shop for Payment Splits and ERC2981 Royalty Definition.
 */
abstract contract NFTCSplitsAndRoyalties is NFTCPaymentSplitter, ERC2981_NFTCExtended {
    constructor(
        address[] memory __addresses,
        uint256[] memory __splits,
        address defaultRoyaltyReceiver,
        uint96 defaultRoyaltyBasisPoints
    ) NFTCPaymentSplitterBase(__addresses, __splits) {
        // Default royalty information to be this contract, so that no potential
        // royalty payments are missed by marketplaces that support ERC2981.
        _setDefaultRoyalty(defaultRoyaltyReceiver, defaultRoyaltyBasisPoints);
    }

    function _isOwner() internal view virtual override(NFTCPaymentSplitter, ERC2981_NFTCExtended);
}

File 14 of 29 : ERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Modern, minimalist, and gas-optimized ERC721 implementation.
/// @author SolDAO (https://github.com/Sol-DAO/solbase/blob/main/src/tokens/ERC721.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

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

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

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

    /// -----------------------------------------------------------------------
    /// Custom Errors
    /// -----------------------------------------------------------------------

    error NotMinted();

    error ZeroAddress();

    error Unauthorized();

    error WrongFrom();

    error InvalidRecipient();

    error UnsafeRecipient();

    error AlreadyMinted();

    /// -----------------------------------------------------------------------
    /// Metadata Storage/Logic
    /// -----------------------------------------------------------------------

    string public name;

    string public symbol;

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

    /// -----------------------------------------------------------------------
    /// ERC721 Balance/Owner Storage
    /// -----------------------------------------------------------------------

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        if ((owner = _ownerOf[id]) == address(0)) revert NotMinted();
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        if (owner == address(0)) revert ZeroAddress();
        return _balanceOf[owner];
    }

    /// -----------------------------------------------------------------------
    /// ERC721 Approval Storage
    /// -----------------------------------------------------------------------

    mapping(uint256 => address) public getApproved;

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

    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------

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

    /// -----------------------------------------------------------------------
    /// ERC721 Logic
    /// -----------------------------------------------------------------------

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

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

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

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

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

    function transferFrom(address from, address to, uint256 id) public virtual {
        if (from != _ownerOf[id]) revert WrongFrom();

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

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

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

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

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

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

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

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

    /// -----------------------------------------------------------------------
    /// ERC165 Logic
    /// -----------------------------------------------------------------------

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

    /// -----------------------------------------------------------------------
    /// Internal Mint/Burn Logic
    /// -----------------------------------------------------------------------

    function _mint(address to, uint256 id) internal virtual {
        if (to == address(0)) revert InvalidRecipient();

        if (_ownerOf[id] != address(0)) revert AlreadyMinted();

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

        _ownerOf[id] = to;

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

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

        if (owner == address(0)) revert NotMinted();

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

        delete _ownerOf[id];

        delete getApproved[id];

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

    /// -----------------------------------------------------------------------
    /// Internal Safe Mint Logic
    /// -----------------------------------------------------------------------

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

        if (to.code.length != 0) {
            if (
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, '') !=
                ERC721TokenReceiver.onERC721Received.selector
            ) revert UnsafeRecipient();
        }
    }

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

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

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

File 15 of 29 : ERC721SolBaseBurnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

// NFTC Open Source Contracts (https://github.com/NFTCulture/nftc-contracts/tree/main)
import './ERC721SolBaseSupply.sol';

/**
 * @title ERC721SolBaseBurnable
 * @author @NiftyMike | @NFTCulture
 *
 * @dev ERC721 SolBase extension to enable tokens that can be irreversibly burned (destroyed).
 */
abstract contract ERC721SolBaseBurnable is ERC721SolBaseSupply {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId`.
     */
    function burn(uint256 tokenId) public virtual {
        address owner = _ownerOf[tokenId];

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

        _burn(tokenId);
    }
}

File 16 of 29 : ERC721SolBaseSupply.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

// OZ Libraries
import '@openzeppelin/contracts/utils/Context.sol';

// NFTC Open Source Contracts (https://github.com/NFTCulture/nftc-contracts/tree/main)
import '../ERC721.sol';

/**
 * @title ERC721SolBaseSupply
 * @author @NiftyMike | @NFTCulture
 *
 * @dev ERC721 SolBase extension to enable tracking of supply and number minted.
 *
 * NOTE: Not a full ERC721Enumerable implementation.
 */
abstract contract ERC721SolBaseSupply is ERC721 {
    uint64 private mintedTokenCounter;
    uint64 private burnedTokenCounter;

    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply();
    }

    function _totalSupply() internal view virtual returns (uint256) {
        return mintedTokenCounter - burnedTokenCounter;
    }

    function totalMinted() public view virtual returns (uint256) {
        return _totalMinted();
    }

    function _totalMinted() internal view virtual returns (uint256) {
        return mintedTokenCounter;
    }

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        super.transferFrom(from, to, tokenId);

        if (to == address(0)) {
            burnedTokenCounter++;
        }
    }

    function _mint(address to, uint256 tokenId) internal override {
        super._mint(to, tokenId);

        mintedTokenCounter++;
    }

    function _burn(uint256 tokenId) internal override {
        super._burn(tokenId);

        burnedTokenCounter++;
    }

    function exists(uint256 tokenId) external view virtual returns (bool) {
        return _exists(tokenId);
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf[tokenId] != address(0);
    }
}

File 17 of 29 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 18 of 29 : IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

File 19 of 29 : ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 20 of 29 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

File 22 of 29 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 23 of 29 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 24 of 29 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

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

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

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

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

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

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

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

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 25 of 29 : SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

File 26 of 29 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";
import "./math/SignedMath.sol";

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

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

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

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

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

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

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

File 27 of 29 : OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        virtual
    {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))

            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}

File 28 of 29 : PixelPioneerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// NFTC Prerelease Contracts
import '@nftculture/nftc-contracts-private/contracts/business/SafetyLatch.sol';
import '@nftculture/nftc-contracts-private/contracts/metadata/v1/ChainNativeMetadataConsumer.sol';
import '@nftculture/nftc-contracts-private/contracts/token/v4/ERC721SolBase_NFTC.sol';

// OZ Libraries
import '@openzeppelin/contracts/utils/Strings.sol';

// Error Codes
error ExceedsBatchSize();
error ExceedsPurchaseLimit();
error ExceedsSupplyCap();
error InvalidPayment();

/**
 * @title PixelPioneerBase
 * @author @NiftyMike | @NFTCulture
 * @dev ERC721 SolBase implementation with @NFTCulture standardized components.
 *
 * Tokens are minted in advance by the project team.
 */
abstract contract PixelPioneerBase is ERC721SolBase_NFTC, ChainNativeMetadataConsumer, SafetyLatch {
    using Strings for uint256;

    // Pixel Pioneer collection is limited to 5 tokens.
    uint16 private constant MAX_RESERVE_BATCH_SIZE = 5;
    uint16 private constant SUPPLY_CAP = 5;

    constructor(string memory __baseURI) ERC721SolBase_NFTC(SUPPLY_CAP, __baseURI) {
        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), 'No token');

        uint256 tokenType = _getProducer().getTokenTypeForToken(tokenId);
        return _getProducer().getJsonAsEncodedString(tokenId, tokenType);
    }

    /**
     * @notice Owner: advance mint tokens.
     *
     * @param destination address to send tokens to.
     * @param count the number of tokens to mint.
     */
    function advanceMintTokens(address destination, uint256 count) external isOwner {
        _advanceMintTokens(destination, count);
    }

    function _advanceMintTokens(address destination, uint256 count) internal {
        if (0 >= count || count > MAX_RESERVE_BATCH_SIZE) revert ExceedsBatchSize();

        uint256 currentTM = _totalMinted();
        if (currentTM + count > SUPPLY_CAP) revert ExceedsSupplyCap();

        uint256 tokenId;
        for (tokenId = currentTM; tokenId < currentTM + count; tokenId++) {
            _internalMintTokens(destination, tokenId);
        }
    }

    function _internalMintTokens(address minter, uint256 tokenId) internal {
        _safeMint(minter, tokenId);
    }

    function _executeOnDestruct() internal override {
        uint256 idx;

        for (idx; idx < _totalMinted(); idx++) {
            if (_exists(idx)) {
                _burn(idx);
            }
        }
    }

    /**
     * @notice Total number of tokens that currently exist.
     */
    function totalTokensExist() external view override returns (uint256) {
        return _totalSupply();
    }
}

File 29 of 29 : PixelPioneerSplitsAndRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

// NFTC Open Source Contracts See: https://github.com/NFTCulture/nftc-contracts
import '@nftculture/nftc-contracts/contracts/financial/NFTCSplitsAndRoyalties.sol';

abstract contract PixelPioneerSplitsAndRoyalties is NFTCSplitsAndRoyalties {
    address[] internal addresses = [0xB19C6659570b64DAd956b1A1b477764C9eF9546f];

    uint256[] internal splits = [100];

    uint96 private constant DEFAULT_ROYALTY_BASIS_POINTS = 1000;

    constructor() NFTCSplitsAndRoyalties(addresses, splits, address(this), DEFAULT_ROYALTY_BASIS_POINTS) {
        // Nothing to do.
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyMinted","type":"error"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"DestructExpired","type":"error"},{"inputs":[],"name":"DestructRevoked","type":"error"},{"inputs":[],"name":"ExceedsBatchSize","type":"error"},{"inputs":[],"name":"ExceedsSupplyCap","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"NotMinted","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"inputs":[],"name":"WrongFrom","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"PayeeTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"advanceMintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOwnedBy","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":[],"name":"canDestruct","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destructContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subscription","type":"address"},{"internalType":"bool","name":"subscribe","type":"bool"}],"name":"registerForOperatorFiltering","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseToSelf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeDestruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReceiver","type":"address"},{"internalType":"uint96","name":"newRoyalty","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__metadataProducer","type":"address"}],"name":"setProducer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensExist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405273b19c6659570b64dad956b1a1b477764c9ef9546f60c09081526200002e90600790600162000743565b506040805160208101909152606481526200004e906008906001620007ad565b506011805460ff60a81b191690553480156200006957600080fd5b506040518060600160405280602e815260200162003633602e9139630116878473cd17e53cea841ff9be6cfc99d285db754a6175f1600561ffff16836040518060400160405280600c81526020016b2834bc32b62834b7b732b2b960a11b815250604051806040016040528060048152602001634b48383760e01b81525060078054806020026020016040519081016040528092919081815260200182805480156200013f57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000120575b505050505060088054806020026020016040519081016040528092919081815260200182805480156200019257602002820191906000526020600020905b8154815260200190600101908083116200017d575b5050505050306103e883838051825114620001f45760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206c656e677468206d69736d6174636860448201526064015b60405180910390fd5b6000825111620002475760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620001eb565b60005b8251811015620002b3576200029e8382815181106200026d576200026d62000807565b60200260200101518383815181106200028a576200028a62000807565b60200260200101516200035260201b60201c565b80620002aa8162000833565b9150506200024a565b505050620002c882826200051f60201b60201c565b505050508160099081620002dd9190620008f4565b50600a620002ec8282620008f4565b5050506001600160401b03821660805260106200030a8282620008f4565b5050506200031e816200062060201b60201c565b5060a0526200032c62000654565b506011805460ff191660011790556200034c620003463390565b62000677565b620009dc565b6001600160a01b038216620003aa5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f20616464726573730000006044820152606401620001eb565b60008111620003fc5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401620001eb565b6001600160a01b038216600090815260026020526040902054156200046e5760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a207061796565206861732073686172656044820152607360f81b6064820152608401620001eb565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038416908117909155600090815260026020526040812082905554620004d6908290620009c0565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6127106001600160601b03821611156200058f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620001eb565b6001600160a01b038216620005e75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001eb565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600555565b6001600160a01b03811615620006515760118054610100600160a81b0319166101006001600160a01b038416021790555b50565b62000675733cc6cdda760b79bafa08df41ecfa224f810dceb66001620006c9565b565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0390911690637d3e3dbe81620006f95782620006f25750634420e486620006f9565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af162000739578060005160e01c036200073957600080fd5b5060006024525050565b8280548282559060005260206000209081019282156200079b579160200282015b828111156200079b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000764565b50620007a9929150620007f0565b5090565b8280548282559060005260206000209081019282156200079b579160200282015b828111156200079b578251829060ff16905591602001919060010190620007ce565b5b80821115620007a95760008155600101620007f1565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200084857620008486200081d565b5060010190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200087a57607f821691505b6020821081036200089b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008ef57600081815260208120601f850160051c81016020861015620008ca5750805b601f850160051c820191505b81811015620008eb57828155600101620008d6565b5050505b505050565b81516001600160401b038111156200091057620009106200084f565b620009288162000921845462000865565b84620008a1565b602080601f831160018114620009605760008415620009475750858301515b600019600386901b1c1916600185901b178555620008eb565b600085815260208120601f198616915b82811015620009915788860151825594840194600190910190840162000970565b5085821015620009b05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620009d657620009d66200081d565b92915050565b60805160a051612c2362000a1060003960008181610c42015261103201526000818161053f015261089b0152612c236000f3fe6080604052600436106103015760003560e01c806370a082311161018f578063a3f8eace116100e1578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146108f3578063f2fde38b1461092e578063fb796e6c1461094e57600080fd5b8063d5abeb011461088c578063e228c6fe146108c9578063e33b7de3146108de57600080fd5b8063b88d4fde116100bb578063b88d4fde14610816578063c87b56dd14610836578063ce7c2ac21461085657600080fd5b8063a3f8eace146107b6578063b329e732146107d6578063b7c0b8e8146107f657600080fd5b80639499e018116101435780639852595c1161011d5780639852595c1461074b578063a22cb46514610781578063a2309ff8146107a157600080fd5b80639499e0181461070157806395d89b411461071657806396a968571461072b57600080fd5b80638b83209b116101745780638b83209b146106a35780638da5cb5b146106c3578063938e3d7b146106e157600080fd5b806370a082311461066e578063715018a61461068e57600080fd5b80632b38bafc1161025357806346d8efad116101fc578063585997e3116101d6578063585997e3146104565780636352211e146106395780636c0360eb1461065957600080fd5b806346d8efad146105e45780634f44aacb146106045780634f558e791461061957600080fd5b80633a98ef391161022d5780633a98ef391461058f57806342842e0e146105a457806342966c68146105c457600080fd5b80632b38bafc1461050d57806332cb6b0c1461052d57806337929eb41461057a57600080fd5b806316348009116102b55780631a7a65371161028f5780631a7a65371461049957806323b872dd146104ae5780632a55205a146104ce57600080fd5b8063163480091461043657806318160ddd14610456578063191655871461047957600080fd5b806306fdde03116102e657806306fdde03146103a6578063081812fc146103c8578063095ea7b31461041657600080fd5b806301ffc9a71461034f57806304634d8d1461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a366004612505565b610968565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b506103a461039f366004612537565b610988565b005b3480156103b257600080fd5b506103bb61099e565b60405161037b91906125a5565b3480156103d457600080fd5b506103fe6103e33660046125d8565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b34801561042257600080fd5b506103a46104313660046125f1565b610a2c565b34801561044257600080fd5b506103a461045136600461261d565b610a74565b34801561046257600080fd5b5061046b610c07565b60405190815260200161037b565b34801561048557600080fd5b506103a461049436600461261d565b610c16565b3480156104a557600080fd5b5061036f610c2a565b3480156104ba57600080fd5b506103a46104c936600461263a565b610c76565b3480156104da57600080fd5b506104ee6104e936600461267b565b610cc7565b604080516001600160a01b03909316835260208301919091520161037b565b34801561051957600080fd5b506103a461052836600461261d565b610d82565b34801561053957600080fd5b506105617f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161037b565b34801561058657600080fd5b506103bb610d93565b34801561059b57600080fd5b5060005461046b565b3480156105b057600080fd5b506103a46105bf36600461263a565b610d9d565b3480156105d057600080fd5b506103a46105df3660046125d8565b610de8565b3480156105f057600080fd5b506103a46105ff3660046126ad565b610e7d565b34801561061057600080fd5b506103a4610e8f565b34801561062557600080fd5b5061036f6106343660046125d8565b610ec7565b34801561064557600080fd5b506103fe6106543660046125d8565b610ee6565b34801561066557600080fd5b506103bb610f21565b34801561067a57600080fd5b5061046b61068936600461261d565b610f2e565b34801561069a57600080fd5b506103a4610f8c565b3480156106af57600080fd5b506103fe6106be3660046125d8565b610fa0565b3480156106cf57600080fd5b506012546001600160a01b03166103fe565b3480156106ed57600080fd5b506103a46106fc366004612751565b610fd0565b34801561070d57600080fd5b506103a4610fe4565b34801561072257600080fd5b506103bb611091565b34801561073757600080fd5b5061046b61074636600461261d565b61109e565b34801561075757600080fd5b5061046b61076636600461261d565b6001600160a01b031660009081526003602052604090205490565b34801561078d57600080fd5b506103a461079c3660046126ad565b6110a9565b3480156107ad57600080fd5b5061046b6110ec565b3480156107c257600080fd5b5061046b6107d136600461261d565b611101565b3480156107e257600080fd5b506103a46107f13660046125f1565b61110c565b34801561080257600080fd5b506103a46108113660046127d1565b61111e565b34801561082257600080fd5b506103a46108313660046127ec565b611139565b34801561084257600080fd5b506103bb6108513660046125d8565b61118e565b34801561086257600080fd5b5061046b61087136600461261d565b6001600160a01b031660009081526002602052604090205490565b34801561089857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1661046b565b3480156108d557600080fd5b506103a461132b565b3480156108ea57600080fd5b5060015461046b565b3480156108ff57600080fd5b5061036f61090e36600461288b565b600e60209081526000928352604080842090915290825290205460ff1681565b34801561093a57600080fd5b506103a461094936600461261d565b611334565b34801561095a57600080fd5b5060115461036f9060ff1681565b6000610973826113c1565b80610982575061098282611441565b92915050565b61099061148f565b61099a82826114d3565b5050565b600980546109ab906128b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d7906128b9565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b505050505081565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b03821614610a655760115460ff1615610a6557610a65816115ed565b610a6f8383611631565b505050565b6001600160a01b038116610acf5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f206164647265737300000060448201526064015b60405180910390fd5b33600090815260026020526040902054610b2b5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f206f776e6564207368617265736044820152606401610ac6565b6001600160a01b03811660009081526002602052604090205415610bb75760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a2070617965652068617320736861726560448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ac6565b610bc0816116f6565b7f6829b4029cd073199f80f49556d32953c9bc4e14d395388e678d2cc4604d481933604080516001600160a01b03928316815291841660208301520160405180910390a150565b6000610c116117c2565b905090565b610c1e61148f565b610c27816117f9565b50565b601154600090600160a81b900460ff1680610c6557507f00000000000000000000000000000000000000000000000000000000000000004310155b15610c705750600090565b50600190565b826001600160a01b0381163314610cb657731e0049783f008a0085193e00003d00cd54003c713314610cb65760115460ff1615610cb657610cb6336115ed565b610cc1848484611940565b50505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610d465750604080518082019091526005546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610d6a906bffffffffffffffffffffffff1687612909565b610d749190612920565b915196919550909350505050565b610d8a61148f565b610c27816119ab565b6060610c116119f6565b826001600160a01b0381163314610ddd57731e0049783f008a0085193e00003d00cd54003c713314610ddd5760115460ff1615610ddd57610ddd336115ed565b610cc1848484611a88565b6000818152600b60205260409020546001600160a01b0316338114801590610e3457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b8015610e5757506000828152600d60205260409020546001600160a01b03163314155b15610e74576040516282b42960e81b815260040160405180910390fd5b61099a82611b56565b610e8561148f565b61099a8282611baf565b610e9761148f565b601180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000818152600b60205260408120546001600160a01b03161515610982565b6000818152600b60205260409020546001600160a01b031680610f1c57604051634d5e5fb360e01b815260040160405180910390fd5b919050565b601080546109ab906128b9565b60006001600160a01b038216610f70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03166000908152600c602052604090205490565b610f94611c24565b610f9e6000611c7e565b565b600060048281548110610fb557610fb5612942565b6000918252602090912001546001600160a01b031692915050565b610fd861148f565b601061099a828261299e565b610fec61148f565b601154600160a81b900460ff1615611030576040517f4ed82f1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004310611089576040517f37c3017c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e611cd0565b600a80546109ab906128b9565b600061098282610f2e565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b038216146110e25760115460ff16156110e2576110e2816115ed565b610a6f8383611d1f565b6000610c11600f5467ffffffffffffffff1690565b600061098282611d8b565b61111461148f565b61099a8282611dcc565b61112661148f565b6011805460ff1916911515919091179055565b846001600160a01b038116331461117957731e0049783f008a0085193e00003d00cd54003c7133146111795760115460ff161561117957611179336115ed565b6111868686868686611e9a565b505050505050565b6000818152600b60205260409020546060906001600160a01b03166111f55760405162461bcd60e51b815260206004820152600860248201527f4e6f20746f6b656e0000000000000000000000000000000000000000000000006044820152606401610ac6565b6011546040517fdf9329ad0000000000000000000000000000000000000000000000000000000081526004810184905260009161010090046001600160a01b03169063df9329ad90602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612a5e565b60115490915061010090046001600160a01b03166040517f6325520600000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b039190911690636325520690604401600060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113249190810190612a77565b9392505050565b610f9e336117f9565b61133c611c24565b6001600160a01b0381166113b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac6565b610c2781611c7e565b60006301ffc9a760e01b6001600160e01b03198316148061140b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109825750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061098257506301ffc9a760e01b6001600160e01b0319831614610982565b6012546001600160a01b03163314610f9e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127106bffffffffffffffffffffffff821611156115595760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610ac6565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ac6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600555565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611629573d6000803e3d6000fd5b6000603a5250565b6000818152600b60205260409020546001600160a01b031633811480159061167d57506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b1561169a576040516282b42960e81b815260040160405180910390fd5b6000828152600d602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6004546000036117035750565b60005b60045461171590600190612aee565b81101561099a57336001600160a01b03166004828154811061173957611739612942565b6000918252602090912001546001600160a01b0316036117b057816004828154811061176757611767612942565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600290915260408083208054948716845290832093909355815290555b806117ba81612b01565b915050611706565b600f546000906117ea9067ffffffffffffffff68010000000000000000820481169116612b1a565b67ffffffffffffffff16905090565b6001600160a01b03811660009081526002602052604090205461185e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401610ac6565b600061186982611d8b565b9050806000036118bb5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f7420647565207061796d656e746044820152606401610ac6565b80600160008282546118cd9190612b42565b90915550506001600160a01b03821660009081526003602052604090208054820190556118fa8282611f5d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b61194b838383612076565b6001600160a01b038216610a6f57600f805468010000000000000000900467ffffffffffffffff1690600861197f83612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6001600160a01b03811615610c2757601180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90911617905550565b606060108054611a05906128b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906128b9565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b611a93838383610c76565b6001600160a01b0382163b15610a6f57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612b7c565b6001600160e01b03191614610a6f57604051633da6393160e01b815260040160405180910390fd5b611b5f816121fc565b600f805468010000000000000000900467ffffffffffffffff16906008611b8583612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6001600160a01b0390911690637d3e3dbe81611bdc5782611bd55750634420e486611bdc565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1611c1a578060005160e01c03611c1a57600080fd5b5060006024525050565b6012546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac6565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b600f5467ffffffffffffffff16811015610c27576000818152600b60205260409020546001600160a01b031615611d0d57611d0d81611b56565b80611d1781612b01565b915050611cd3565b336000818152600e602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611d9760015490565b611da19047612b42565b90506113248382611dc7866001600160a01b031660009081526003602052604090205490565b6122ad565b801580611dd95750600581115b15611e10576040517f719b10a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e25600f5467ffffffffffffffff1690565b90506005611e338383612b42565b1115611e6b576040517f62aef31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b611e778383612b42565b811015610cc157611e8884826122f0565b80611e9281612b01565b915050611e6d565b611ea5858585610c76565b6001600160a01b0384163b15611f5657604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611eeb9033908a90899089908990600401612b99565b6020604051808303816000875af1158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612b7c565b6001600160e01b03191614611f5657604051633da6393160e01b815260040160405180910390fd5b5050505050565b80471015611fad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ffa576040519150601f19603f3d011682016040523d82523d6000602084013e611fff565b606091505b5050905080610a6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6000818152600b60205260409020546001600160a01b038481169116146120c9576040517fc6de3f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166120f057604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061212d57506001600160a01b0383166000908152600e6020908152604080832033845290915290205460ff16155b801561215057506000818152600d60205260409020546001600160a01b03163314155b1561216d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038084166000818152600c60209081526040808320805460001901905593861680835284832080546001019055858352600b825284832080546001600160a01b03199081168317909155600d90925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600b60205260409020546001600160a01b03168061223257604051634d5e5fb360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600c602090815260408083208054600019019055858352600b825280832080546001600160a01b0319908116909155600d9092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b0385168252600260205260408220548391906122d49086612909565b6122de9190612920565b6122e89190612aee565b949350505050565b61099a82826122ff82826123bf565b6001600160a01b0382163b1561099a57604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190612b7c565b6001600160e01b0319161461099a57604051633da6393160e01b815260040160405180910390fd5b6123c9828261240e565b600f805467ffffffffffffffff169060006123e383612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b6001600160a01b03821661243557604051634e46966960e11b815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b031615612484576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000818152600c6020908152604080832080546001019055848352600b90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610c2757600080fd5b60006020828403121561251757600080fd5b8135611324816124ef565b6001600160a01b0381168114610c2757600080fd5b6000806040838503121561254a57600080fd5b823561255581612522565b915060208301356bffffffffffffffffffffffff8116811461257657600080fd5b809150509250929050565b60005b8381101561259c578181015183820152602001612584565b50506000910152565b60208152600082518060208401526125c4816040850160208701612581565b601f01601f19169190910160400192915050565b6000602082840312156125ea57600080fd5b5035919050565b6000806040838503121561260457600080fd5b823561260f81612522565b946020939093013593505050565b60006020828403121561262f57600080fd5b813561132481612522565b60008060006060848603121561264f57600080fd5b833561265a81612522565b9250602084013561266a81612522565b929592945050506040919091013590565b6000806040838503121561268e57600080fd5b50508035926020909101359150565b80358015158114610f1c57600080fd5b600080604083850312156126c057600080fd5b82356126cb81612522565b91506126d96020840161269d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612721576127216126e2565b604052919050565b600067ffffffffffffffff821115612743576127436126e2565b50601f01601f191660200190565b60006020828403121561276357600080fd5b813567ffffffffffffffff81111561277a57600080fd5b8201601f8101841361278b57600080fd5b803561279e61279982612729565b6126f8565b8181528560208385010111156127b357600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156127e357600080fd5b6113248261269d565b60008060008060006080868803121561280457600080fd5b853561280f81612522565b9450602086013561281f81612522565b935060408601359250606086013567ffffffffffffffff8082111561284357600080fd5b818801915088601f83011261285757600080fd5b81358181111561286657600080fd5b89602082850101111561287857600080fd5b9699959850939650602001949392505050565b6000806040838503121561289e57600080fd5b82356128a981612522565b9150602083013561257681612522565b600181811c908216806128cd57607f821691505b6020821081036128ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610982576109826128f3565b60008261293d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a6f57600081815260208120601f850160051c8101602086101561297f5750805b601f850160051c820191505b818110156111865782815560010161298b565b815167ffffffffffffffff8111156129b8576129b86126e2565b6129cc816129c684546128b9565b84612958565b602080601f831160018114612a0157600084156129e95750858301515b600019600386901b1c1916600185901b178555611186565b600085815260208120601f198616915b82811015612a3057888601518255948401946001909101908401612a11565b5085821015612a4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612a7057600080fd5b5051919050565b600060208284031215612a8957600080fd5b815167ffffffffffffffff811115612aa057600080fd5b8201601f81018413612ab157600080fd5b8051612abf61279982612729565b818152856020838501011115612ad457600080fd5b612ae5826020830160208601612581565b95945050505050565b81810381811115610982576109826128f3565b600060018201612b1357612b136128f3565b5060010190565b67ffffffffffffffff828116828216039080821115612b3b57612b3b6128f3565b5092915050565b80820180821115610982576109826128f3565b600067ffffffffffffffff808316818103612b7257612b726128f3565b6001019392505050565b600060208284031215612b8e57600080fd5b8151611324816124ef565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f8501168301019050969550505050505056fea26469706673582212202d09c116d6383ae2f23a76b108e2417c0dfd9fe69b589917566da3322e74065f64736f6c6343000813003368747470733a2f2f7777772e686172696e672e636f6d2f212f6e66742d6f776e6572736869702d6c6963656e7365

Deployed Bytecode

0x6080604052600436106103015760003560e01c806370a082311161018f578063a3f8eace116100e1578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146108f3578063f2fde38b1461092e578063fb796e6c1461094e57600080fd5b8063d5abeb011461088c578063e228c6fe146108c9578063e33b7de3146108de57600080fd5b8063b88d4fde116100bb578063b88d4fde14610816578063c87b56dd14610836578063ce7c2ac21461085657600080fd5b8063a3f8eace146107b6578063b329e732146107d6578063b7c0b8e8146107f657600080fd5b80639499e018116101435780639852595c1161011d5780639852595c1461074b578063a22cb46514610781578063a2309ff8146107a157600080fd5b80639499e0181461070157806395d89b411461071657806396a968571461072b57600080fd5b80638b83209b116101745780638b83209b146106a35780638da5cb5b146106c3578063938e3d7b146106e157600080fd5b806370a082311461066e578063715018a61461068e57600080fd5b80632b38bafc1161025357806346d8efad116101fc578063585997e3116101d6578063585997e3146104565780636352211e146106395780636c0360eb1461065957600080fd5b806346d8efad146105e45780634f44aacb146106045780634f558e791461061957600080fd5b80633a98ef391161022d5780633a98ef391461058f57806342842e0e146105a457806342966c68146105c457600080fd5b80632b38bafc1461050d57806332cb6b0c1461052d57806337929eb41461057a57600080fd5b806316348009116102b55780631a7a65371161028f5780631a7a65371461049957806323b872dd146104ae5780632a55205a146104ce57600080fd5b8063163480091461043657806318160ddd14610456578063191655871461047957600080fd5b806306fdde03116102e657806306fdde03146103a6578063081812fc146103c8578063095ea7b31461041657600080fd5b806301ffc9a71461034f57806304634d8d1461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a366004612505565b610968565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b506103a461039f366004612537565b610988565b005b3480156103b257600080fd5b506103bb61099e565b60405161037b91906125a5565b3480156103d457600080fd5b506103fe6103e33660046125d8565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b34801561042257600080fd5b506103a46104313660046125f1565b610a2c565b34801561044257600080fd5b506103a461045136600461261d565b610a74565b34801561046257600080fd5b5061046b610c07565b60405190815260200161037b565b34801561048557600080fd5b506103a461049436600461261d565b610c16565b3480156104a557600080fd5b5061036f610c2a565b3480156104ba57600080fd5b506103a46104c936600461263a565b610c76565b3480156104da57600080fd5b506104ee6104e936600461267b565b610cc7565b604080516001600160a01b03909316835260208301919091520161037b565b34801561051957600080fd5b506103a461052836600461261d565b610d82565b34801561053957600080fd5b506105617f000000000000000000000000000000000000000000000000000000000000000581565b60405167ffffffffffffffff909116815260200161037b565b34801561058657600080fd5b506103bb610d93565b34801561059b57600080fd5b5060005461046b565b3480156105b057600080fd5b506103a46105bf36600461263a565b610d9d565b3480156105d057600080fd5b506103a46105df3660046125d8565b610de8565b3480156105f057600080fd5b506103a46105ff3660046126ad565b610e7d565b34801561061057600080fd5b506103a4610e8f565b34801561062557600080fd5b5061036f6106343660046125d8565b610ec7565b34801561064557600080fd5b506103fe6106543660046125d8565b610ee6565b34801561066557600080fd5b506103bb610f21565b34801561067a57600080fd5b5061046b61068936600461261d565b610f2e565b34801561069a57600080fd5b506103a4610f8c565b3480156106af57600080fd5b506103fe6106be3660046125d8565b610fa0565b3480156106cf57600080fd5b506012546001600160a01b03166103fe565b3480156106ed57600080fd5b506103a46106fc366004612751565b610fd0565b34801561070d57600080fd5b506103a4610fe4565b34801561072257600080fd5b506103bb611091565b34801561073757600080fd5b5061046b61074636600461261d565b61109e565b34801561075757600080fd5b5061046b61076636600461261d565b6001600160a01b031660009081526003602052604090205490565b34801561078d57600080fd5b506103a461079c3660046126ad565b6110a9565b3480156107ad57600080fd5b5061046b6110ec565b3480156107c257600080fd5b5061046b6107d136600461261d565b611101565b3480156107e257600080fd5b506103a46107f13660046125f1565b61110c565b34801561080257600080fd5b506103a46108113660046127d1565b61111e565b34801561082257600080fd5b506103a46108313660046127ec565b611139565b34801561084257600080fd5b506103bb6108513660046125d8565b61118e565b34801561086257600080fd5b5061046b61087136600461261d565b6001600160a01b031660009081526002602052604090205490565b34801561089857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000567ffffffffffffffff1661046b565b3480156108d557600080fd5b506103a461132b565b3480156108ea57600080fd5b5060015461046b565b3480156108ff57600080fd5b5061036f61090e36600461288b565b600e60209081526000928352604080842090915290825290205460ff1681565b34801561093a57600080fd5b506103a461094936600461261d565b611334565b34801561095a57600080fd5b5060115461036f9060ff1681565b6000610973826113c1565b80610982575061098282611441565b92915050565b61099061148f565b61099a82826114d3565b5050565b600980546109ab906128b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d7906128b9565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b505050505081565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b03821614610a655760115460ff1615610a6557610a65816115ed565b610a6f8383611631565b505050565b6001600160a01b038116610acf5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f206164647265737300000060448201526064015b60405180910390fd5b33600090815260026020526040902054610b2b5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f206f776e6564207368617265736044820152606401610ac6565b6001600160a01b03811660009081526002602052604090205415610bb75760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a2070617965652068617320736861726560448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ac6565b610bc0816116f6565b7f6829b4029cd073199f80f49556d32953c9bc4e14d395388e678d2cc4604d481933604080516001600160a01b03928316815291841660208301520160405180910390a150565b6000610c116117c2565b905090565b610c1e61148f565b610c27816117f9565b50565b601154600090600160a81b900460ff1680610c6557507f00000000000000000000000000000000000000000000000000000000011687844310155b15610c705750600090565b50600190565b826001600160a01b0381163314610cb657731e0049783f008a0085193e00003d00cd54003c713314610cb65760115460ff1615610cb657610cb6336115ed565b610cc1848484611940565b50505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610d465750604080518082019091526005546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610d6a906bffffffffffffffffffffffff1687612909565b610d749190612920565b915196919550909350505050565b610d8a61148f565b610c27816119ab565b6060610c116119f6565b826001600160a01b0381163314610ddd57731e0049783f008a0085193e00003d00cd54003c713314610ddd5760115460ff1615610ddd57610ddd336115ed565b610cc1848484611a88565b6000818152600b60205260409020546001600160a01b0316338114801590610e3457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b8015610e5757506000828152600d60205260409020546001600160a01b03163314155b15610e74576040516282b42960e81b815260040160405180910390fd5b61099a82611b56565b610e8561148f565b61099a8282611baf565b610e9761148f565b601180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000818152600b60205260408120546001600160a01b03161515610982565b6000818152600b60205260409020546001600160a01b031680610f1c57604051634d5e5fb360e01b815260040160405180910390fd5b919050565b601080546109ab906128b9565b60006001600160a01b038216610f70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03166000908152600c602052604090205490565b610f94611c24565b610f9e6000611c7e565b565b600060048281548110610fb557610fb5612942565b6000918252602090912001546001600160a01b031692915050565b610fd861148f565b601061099a828261299e565b610fec61148f565b601154600160a81b900460ff1615611030576040517f4ed82f1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000011687844310611089576040517f37c3017c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e611cd0565b600a80546109ab906128b9565b600061098282610f2e565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b038216146110e25760115460ff16156110e2576110e2816115ed565b610a6f8383611d1f565b6000610c11600f5467ffffffffffffffff1690565b600061098282611d8b565b61111461148f565b61099a8282611dcc565b61112661148f565b6011805460ff1916911515919091179055565b846001600160a01b038116331461117957731e0049783f008a0085193e00003d00cd54003c7133146111795760115460ff161561117957611179336115ed565b6111868686868686611e9a565b505050505050565b6000818152600b60205260409020546060906001600160a01b03166111f55760405162461bcd60e51b815260206004820152600860248201527f4e6f20746f6b656e0000000000000000000000000000000000000000000000006044820152606401610ac6565b6011546040517fdf9329ad0000000000000000000000000000000000000000000000000000000081526004810184905260009161010090046001600160a01b03169063df9329ad90602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612a5e565b60115490915061010090046001600160a01b03166040517f6325520600000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b039190911690636325520690604401600060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113249190810190612a77565b9392505050565b610f9e336117f9565b61133c611c24565b6001600160a01b0381166113b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac6565b610c2781611c7e565b60006301ffc9a760e01b6001600160e01b03198316148061140b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109825750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061098257506301ffc9a760e01b6001600160e01b0319831614610982565b6012546001600160a01b03163314610f9e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127106bffffffffffffffffffffffff821611156115595760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610ac6565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ac6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600555565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611629573d6000803e3d6000fd5b6000603a5250565b6000818152600b60205260409020546001600160a01b031633811480159061167d57506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b1561169a576040516282b42960e81b815260040160405180910390fd5b6000828152600d602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6004546000036117035750565b60005b60045461171590600190612aee565b81101561099a57336001600160a01b03166004828154811061173957611739612942565b6000918252602090912001546001600160a01b0316036117b057816004828154811061176757611767612942565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600290915260408083208054948716845290832093909355815290555b806117ba81612b01565b915050611706565b600f546000906117ea9067ffffffffffffffff68010000000000000000820481169116612b1a565b67ffffffffffffffff16905090565b6001600160a01b03811660009081526002602052604090205461185e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401610ac6565b600061186982611d8b565b9050806000036118bb5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f7420647565207061796d656e746044820152606401610ac6565b80600160008282546118cd9190612b42565b90915550506001600160a01b03821660009081526003602052604090208054820190556118fa8282611f5d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b61194b838383612076565b6001600160a01b038216610a6f57600f805468010000000000000000900467ffffffffffffffff1690600861197f83612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6001600160a01b03811615610c2757601180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90911617905550565b606060108054611a05906128b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906128b9565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b611a93838383610c76565b6001600160a01b0382163b15610a6f57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612b7c565b6001600160e01b03191614610a6f57604051633da6393160e01b815260040160405180910390fd5b611b5f816121fc565b600f805468010000000000000000900467ffffffffffffffff16906008611b8583612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6001600160a01b0390911690637d3e3dbe81611bdc5782611bd55750634420e486611bdc565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1611c1a578060005160e01c03611c1a57600080fd5b5060006024525050565b6012546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac6565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b600f5467ffffffffffffffff16811015610c27576000818152600b60205260409020546001600160a01b031615611d0d57611d0d81611b56565b80611d1781612b01565b915050611cd3565b336000818152600e602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611d9760015490565b611da19047612b42565b90506113248382611dc7866001600160a01b031660009081526003602052604090205490565b6122ad565b801580611dd95750600581115b15611e10576040517f719b10a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e25600f5467ffffffffffffffff1690565b90506005611e338383612b42565b1115611e6b576040517f62aef31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b611e778383612b42565b811015610cc157611e8884826122f0565b80611e9281612b01565b915050611e6d565b611ea5858585610c76565b6001600160a01b0384163b15611f5657604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611eeb9033908a90899089908990600401612b99565b6020604051808303816000875af1158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612b7c565b6001600160e01b03191614611f5657604051633da6393160e01b815260040160405180910390fd5b5050505050565b80471015611fad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ffa576040519150601f19603f3d011682016040523d82523d6000602084013e611fff565b606091505b5050905080610a6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6000818152600b60205260409020546001600160a01b038481169116146120c9576040517fc6de3f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166120f057604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061212d57506001600160a01b0383166000908152600e6020908152604080832033845290915290205460ff16155b801561215057506000818152600d60205260409020546001600160a01b03163314155b1561216d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038084166000818152600c60209081526040808320805460001901905593861680835284832080546001019055858352600b825284832080546001600160a01b03199081168317909155600d90925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600b60205260409020546001600160a01b03168061223257604051634d5e5fb360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600c602090815260408083208054600019019055858352600b825280832080546001600160a01b0319908116909155600d9092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b0385168252600260205260408220548391906122d49086612909565b6122de9190612920565b6122e89190612aee565b949350505050565b61099a82826122ff82826123bf565b6001600160a01b0382163b1561099a57604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190612b7c565b6001600160e01b0319161461099a57604051633da6393160e01b815260040160405180910390fd5b6123c9828261240e565b600f805467ffffffffffffffff169060006123e383612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b6001600160a01b03821661243557604051634e46966960e11b815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b031615612484576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000818152600c6020908152604080832080546001019055848352600b90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610c2757600080fd5b60006020828403121561251757600080fd5b8135611324816124ef565b6001600160a01b0381168114610c2757600080fd5b6000806040838503121561254a57600080fd5b823561255581612522565b915060208301356bffffffffffffffffffffffff8116811461257657600080fd5b809150509250929050565b60005b8381101561259c578181015183820152602001612584565b50506000910152565b60208152600082518060208401526125c4816040850160208701612581565b601f01601f19169190910160400192915050565b6000602082840312156125ea57600080fd5b5035919050565b6000806040838503121561260457600080fd5b823561260f81612522565b946020939093013593505050565b60006020828403121561262f57600080fd5b813561132481612522565b60008060006060848603121561264f57600080fd5b833561265a81612522565b9250602084013561266a81612522565b929592945050506040919091013590565b6000806040838503121561268e57600080fd5b50508035926020909101359150565b80358015158114610f1c57600080fd5b600080604083850312156126c057600080fd5b82356126cb81612522565b91506126d96020840161269d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612721576127216126e2565b604052919050565b600067ffffffffffffffff821115612743576127436126e2565b50601f01601f191660200190565b60006020828403121561276357600080fd5b813567ffffffffffffffff81111561277a57600080fd5b8201601f8101841361278b57600080fd5b803561279e61279982612729565b6126f8565b8181528560208385010111156127b357600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156127e357600080fd5b6113248261269d565b60008060008060006080868803121561280457600080fd5b853561280f81612522565b9450602086013561281f81612522565b935060408601359250606086013567ffffffffffffffff8082111561284357600080fd5b818801915088601f83011261285757600080fd5b81358181111561286657600080fd5b89602082850101111561287857600080fd5b9699959850939650602001949392505050565b6000806040838503121561289e57600080fd5b82356128a981612522565b9150602083013561257681612522565b600181811c908216806128cd57607f821691505b6020821081036128ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610982576109826128f3565b60008261293d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a6f57600081815260208120601f850160051c8101602086101561297f5750805b601f850160051c820191505b818110156111865782815560010161298b565b815167ffffffffffffffff8111156129b8576129b86126e2565b6129cc816129c684546128b9565b84612958565b602080601f831160018114612a0157600084156129e95750858301515b600019600386901b1c1916600185901b178555611186565b600085815260208120601f198616915b82811015612a3057888601518255948401946001909101908401612a11565b5085821015612a4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612a7057600080fd5b5051919050565b600060208284031215612a8957600080fd5b815167ffffffffffffffff811115612aa057600080fd5b8201601f81018413612ab157600080fd5b8051612abf61279982612729565b818152856020838501011115612ad457600080fd5b612ae5826020830160208601612581565b95945050505050565b81810381811115610982576109826128f3565b600060018201612b1357612b136128f3565b5060010190565b67ffffffffffffffff828116828216039080821115612b3b57612b3b6128f3565b5092915050565b80820180821115610982576109826128f3565b600067ffffffffffffffff808316818103612b7257612b726128f3565b6001019392505050565b600060208284031215612b8e57600080fd5b8151611324816124ef565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f8501168301019050969550505050505056fea26469706673582212202d09c116d6383ae2f23a76b108e2417c0dfd9fe69b589917566da3322e74065f64736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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