Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18822034 | 262 days ago | IN | 0 ETH | 0.00294064 | ||||
Set Producer | 18059111 | 369 days ago | IN | 0 ETH | 0.00029008 | ||||
Release | 18045891 | 371 days ago | IN | 0 ETH | 0.00124594 | ||||
Transfer | 18045886 | 371 days ago | IN | 0.001 ETH | 0.00025402 | ||||
Transfer | 18045880 | 371 days ago | IN | 0 ETH | 0.0002245 | ||||
Advance Mint Tok... | 18045855 | 371 days ago | IN | 0 ETH | 0.00148005 | ||||
Advance Mint Tok... | 18045834 | 371 days ago | IN | 0 ETH | 0.00116216 | ||||
0x60e06040 | 18045830 | 371 days ago | IN | 0 ETH | 0.04804076 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18045891 | 371 days ago | 0.001 ETH |
Loading...
Loading
Contract Name:
PixelPioneer
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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(); } }
// 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; }
// 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; }
// 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; } }
// 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); }
// 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(); } }
// 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); }
// 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 }
// 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); }
// 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; }
// 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; }
// 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; }
// 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); }
// 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; } }
// 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); } }
// 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); } }
// 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); } }
// 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); }
// 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]; } }
// 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); } } }
// 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; } }
// 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; } }
// 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); }
// 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); } } }
// 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); } } }
// 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)); } }
// 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; } }
// 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(); } }
// 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. } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60e060405273b19c6659570b64dad956b1a1b477764c9ef9546f60c09081526200002e90600790600162000743565b506040805160208101909152606481526200004e906008906001620007ad565b506011805460ff60a81b191690553480156200006957600080fd5b506040518060600160405280602e815260200162003633602e9139630116878473cd17e53cea841ff9be6cfc99d285db754a6175f1600561ffff16836040518060400160405280600c81526020016b2834bc32b62834b7b732b2b960a11b815250604051806040016040528060048152602001634b48383760e01b81525060078054806020026020016040519081016040528092919081815260200182805480156200013f57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000120575b505050505060088054806020026020016040519081016040528092919081815260200182805480156200019257602002820191906000526020600020905b8154815260200190600101908083116200017d575b5050505050306103e883838051825114620001f45760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206c656e677468206d69736d6174636860448201526064015b60405180910390fd5b6000825111620002475760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620001eb565b60005b8251811015620002b3576200029e8382815181106200026d576200026d62000807565b60200260200101518383815181106200028a576200028a62000807565b60200260200101516200035260201b60201c565b80620002aa8162000833565b9150506200024a565b505050620002c882826200051f60201b60201c565b505050508160099081620002dd9190620008f4565b50600a620002ec8282620008f4565b5050506001600160401b03821660805260106200030a8282620008f4565b5050506200031e816200062060201b60201c565b5060a0526200032c62000654565b506011805460ff191660011790556200034c620003463390565b62000677565b620009dc565b6001600160a01b038216620003aa5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f20616464726573730000006044820152606401620001eb565b60008111620003fc5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401620001eb565b6001600160a01b038216600090815260026020526040902054156200046e5760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a207061796565206861732073686172656044820152607360f81b6064820152608401620001eb565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038416908117909155600090815260026020526040812082905554620004d6908290620009c0565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6127106001600160601b03821611156200058f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620001eb565b6001600160a01b038216620005e75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001eb565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600555565b6001600160a01b03811615620006515760118054610100600160a81b0319166101006001600160a01b038416021790555b50565b62000675733cc6cdda760b79bafa08df41ecfa224f810dceb66001620006c9565b565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0390911690637d3e3dbe81620006f95782620006f25750634420e486620006f9565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af162000739578060005160e01c036200073957600080fd5b5060006024525050565b8280548282559060005260206000209081019282156200079b579160200282015b828111156200079b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000764565b50620007a9929150620007f0565b5090565b8280548282559060005260206000209081019282156200079b579160200282015b828111156200079b578251829060ff16905591602001919060010190620007ce565b5b80821115620007a95760008155600101620007f1565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200084857620008486200081d565b5060010190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200087a57607f821691505b6020821081036200089b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008ef57600081815260208120601f850160051c81016020861015620008ca5750805b601f850160051c820191505b81811015620008eb57828155600101620008d6565b5050505b505050565b81516001600160401b038111156200091057620009106200084f565b620009288162000921845462000865565b84620008a1565b602080601f831160018114620009605760008415620009475750858301515b600019600386901b1c1916600185901b178555620008eb565b600085815260208120601f198616915b82811015620009915788860151825594840194600190910190840162000970565b5085821015620009b05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620009d657620009d66200081d565b92915050565b60805160a051612c2362000a1060003960008181610c42015261103201526000818161053f015261089b0152612c236000f3fe6080604052600436106103015760003560e01c806370a082311161018f578063a3f8eace116100e1578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146108f3578063f2fde38b1461092e578063fb796e6c1461094e57600080fd5b8063d5abeb011461088c578063e228c6fe146108c9578063e33b7de3146108de57600080fd5b8063b88d4fde116100bb578063b88d4fde14610816578063c87b56dd14610836578063ce7c2ac21461085657600080fd5b8063a3f8eace146107b6578063b329e732146107d6578063b7c0b8e8146107f657600080fd5b80639499e018116101435780639852595c1161011d5780639852595c1461074b578063a22cb46514610781578063a2309ff8146107a157600080fd5b80639499e0181461070157806395d89b411461071657806396a968571461072b57600080fd5b80638b83209b116101745780638b83209b146106a35780638da5cb5b146106c3578063938e3d7b146106e157600080fd5b806370a082311461066e578063715018a61461068e57600080fd5b80632b38bafc1161025357806346d8efad116101fc578063585997e3116101d6578063585997e3146104565780636352211e146106395780636c0360eb1461065957600080fd5b806346d8efad146105e45780634f44aacb146106045780634f558e791461061957600080fd5b80633a98ef391161022d5780633a98ef391461058f57806342842e0e146105a457806342966c68146105c457600080fd5b80632b38bafc1461050d57806332cb6b0c1461052d57806337929eb41461057a57600080fd5b806316348009116102b55780631a7a65371161028f5780631a7a65371461049957806323b872dd146104ae5780632a55205a146104ce57600080fd5b8063163480091461043657806318160ddd14610456578063191655871461047957600080fd5b806306fdde03116102e657806306fdde03146103a6578063081812fc146103c8578063095ea7b31461041657600080fd5b806301ffc9a71461034f57806304634d8d1461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a366004612505565b610968565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b506103a461039f366004612537565b610988565b005b3480156103b257600080fd5b506103bb61099e565b60405161037b91906125a5565b3480156103d457600080fd5b506103fe6103e33660046125d8565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b34801561042257600080fd5b506103a46104313660046125f1565b610a2c565b34801561044257600080fd5b506103a461045136600461261d565b610a74565b34801561046257600080fd5b5061046b610c07565b60405190815260200161037b565b34801561048557600080fd5b506103a461049436600461261d565b610c16565b3480156104a557600080fd5b5061036f610c2a565b3480156104ba57600080fd5b506103a46104c936600461263a565b610c76565b3480156104da57600080fd5b506104ee6104e936600461267b565b610cc7565b604080516001600160a01b03909316835260208301919091520161037b565b34801561051957600080fd5b506103a461052836600461261d565b610d82565b34801561053957600080fd5b506105617f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161037b565b34801561058657600080fd5b506103bb610d93565b34801561059b57600080fd5b5060005461046b565b3480156105b057600080fd5b506103a46105bf36600461263a565b610d9d565b3480156105d057600080fd5b506103a46105df3660046125d8565b610de8565b3480156105f057600080fd5b506103a46105ff3660046126ad565b610e7d565b34801561061057600080fd5b506103a4610e8f565b34801561062557600080fd5b5061036f6106343660046125d8565b610ec7565b34801561064557600080fd5b506103fe6106543660046125d8565b610ee6565b34801561066557600080fd5b506103bb610f21565b34801561067a57600080fd5b5061046b61068936600461261d565b610f2e565b34801561069a57600080fd5b506103a4610f8c565b3480156106af57600080fd5b506103fe6106be3660046125d8565b610fa0565b3480156106cf57600080fd5b506012546001600160a01b03166103fe565b3480156106ed57600080fd5b506103a46106fc366004612751565b610fd0565b34801561070d57600080fd5b506103a4610fe4565b34801561072257600080fd5b506103bb611091565b34801561073757600080fd5b5061046b61074636600461261d565b61109e565b34801561075757600080fd5b5061046b61076636600461261d565b6001600160a01b031660009081526003602052604090205490565b34801561078d57600080fd5b506103a461079c3660046126ad565b6110a9565b3480156107ad57600080fd5b5061046b6110ec565b3480156107c257600080fd5b5061046b6107d136600461261d565b611101565b3480156107e257600080fd5b506103a46107f13660046125f1565b61110c565b34801561080257600080fd5b506103a46108113660046127d1565b61111e565b34801561082257600080fd5b506103a46108313660046127ec565b611139565b34801561084257600080fd5b506103bb6108513660046125d8565b61118e565b34801561086257600080fd5b5061046b61087136600461261d565b6001600160a01b031660009081526002602052604090205490565b34801561089857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1661046b565b3480156108d557600080fd5b506103a461132b565b3480156108ea57600080fd5b5060015461046b565b3480156108ff57600080fd5b5061036f61090e36600461288b565b600e60209081526000928352604080842090915290825290205460ff1681565b34801561093a57600080fd5b506103a461094936600461261d565b611334565b34801561095a57600080fd5b5060115461036f9060ff1681565b6000610973826113c1565b80610982575061098282611441565b92915050565b61099061148f565b61099a82826114d3565b5050565b600980546109ab906128b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d7906128b9565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b505050505081565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b03821614610a655760115460ff1615610a6557610a65816115ed565b610a6f8383611631565b505050565b6001600160a01b038116610acf5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f206164647265737300000060448201526064015b60405180910390fd5b33600090815260026020526040902054610b2b5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f206f776e6564207368617265736044820152606401610ac6565b6001600160a01b03811660009081526002602052604090205415610bb75760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a2070617965652068617320736861726560448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ac6565b610bc0816116f6565b7f6829b4029cd073199f80f49556d32953c9bc4e14d395388e678d2cc4604d481933604080516001600160a01b03928316815291841660208301520160405180910390a150565b6000610c116117c2565b905090565b610c1e61148f565b610c27816117f9565b50565b601154600090600160a81b900460ff1680610c6557507f00000000000000000000000000000000000000000000000000000000000000004310155b15610c705750600090565b50600190565b826001600160a01b0381163314610cb657731e0049783f008a0085193e00003d00cd54003c713314610cb65760115460ff1615610cb657610cb6336115ed565b610cc1848484611940565b50505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610d465750604080518082019091526005546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610d6a906bffffffffffffffffffffffff1687612909565b610d749190612920565b915196919550909350505050565b610d8a61148f565b610c27816119ab565b6060610c116119f6565b826001600160a01b0381163314610ddd57731e0049783f008a0085193e00003d00cd54003c713314610ddd5760115460ff1615610ddd57610ddd336115ed565b610cc1848484611a88565b6000818152600b60205260409020546001600160a01b0316338114801590610e3457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b8015610e5757506000828152600d60205260409020546001600160a01b03163314155b15610e74576040516282b42960e81b815260040160405180910390fd5b61099a82611b56565b610e8561148f565b61099a8282611baf565b610e9761148f565b601180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000818152600b60205260408120546001600160a01b03161515610982565b6000818152600b60205260409020546001600160a01b031680610f1c57604051634d5e5fb360e01b815260040160405180910390fd5b919050565b601080546109ab906128b9565b60006001600160a01b038216610f70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03166000908152600c602052604090205490565b610f94611c24565b610f9e6000611c7e565b565b600060048281548110610fb557610fb5612942565b6000918252602090912001546001600160a01b031692915050565b610fd861148f565b601061099a828261299e565b610fec61148f565b601154600160a81b900460ff1615611030576040517f4ed82f1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004310611089576040517f37c3017c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e611cd0565b600a80546109ab906128b9565b600061098282610f2e565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b038216146110e25760115460ff16156110e2576110e2816115ed565b610a6f8383611d1f565b6000610c11600f5467ffffffffffffffff1690565b600061098282611d8b565b61111461148f565b61099a8282611dcc565b61112661148f565b6011805460ff1916911515919091179055565b846001600160a01b038116331461117957731e0049783f008a0085193e00003d00cd54003c7133146111795760115460ff161561117957611179336115ed565b6111868686868686611e9a565b505050505050565b6000818152600b60205260409020546060906001600160a01b03166111f55760405162461bcd60e51b815260206004820152600860248201527f4e6f20746f6b656e0000000000000000000000000000000000000000000000006044820152606401610ac6565b6011546040517fdf9329ad0000000000000000000000000000000000000000000000000000000081526004810184905260009161010090046001600160a01b03169063df9329ad90602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612a5e565b60115490915061010090046001600160a01b03166040517f6325520600000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b039190911690636325520690604401600060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113249190810190612a77565b9392505050565b610f9e336117f9565b61133c611c24565b6001600160a01b0381166113b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac6565b610c2781611c7e565b60006301ffc9a760e01b6001600160e01b03198316148061140b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109825750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061098257506301ffc9a760e01b6001600160e01b0319831614610982565b6012546001600160a01b03163314610f9e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127106bffffffffffffffffffffffff821611156115595760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610ac6565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ac6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600555565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611629573d6000803e3d6000fd5b6000603a5250565b6000818152600b60205260409020546001600160a01b031633811480159061167d57506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b1561169a576040516282b42960e81b815260040160405180910390fd5b6000828152600d602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6004546000036117035750565b60005b60045461171590600190612aee565b81101561099a57336001600160a01b03166004828154811061173957611739612942565b6000918252602090912001546001600160a01b0316036117b057816004828154811061176757611767612942565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600290915260408083208054948716845290832093909355815290555b806117ba81612b01565b915050611706565b600f546000906117ea9067ffffffffffffffff68010000000000000000820481169116612b1a565b67ffffffffffffffff16905090565b6001600160a01b03811660009081526002602052604090205461185e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401610ac6565b600061186982611d8b565b9050806000036118bb5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f7420647565207061796d656e746044820152606401610ac6565b80600160008282546118cd9190612b42565b90915550506001600160a01b03821660009081526003602052604090208054820190556118fa8282611f5d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b61194b838383612076565b6001600160a01b038216610a6f57600f805468010000000000000000900467ffffffffffffffff1690600861197f83612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6001600160a01b03811615610c2757601180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90911617905550565b606060108054611a05906128b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906128b9565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b611a93838383610c76565b6001600160a01b0382163b15610a6f57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612b7c565b6001600160e01b03191614610a6f57604051633da6393160e01b815260040160405180910390fd5b611b5f816121fc565b600f805468010000000000000000900467ffffffffffffffff16906008611b8583612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6001600160a01b0390911690637d3e3dbe81611bdc5782611bd55750634420e486611bdc565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1611c1a578060005160e01c03611c1a57600080fd5b5060006024525050565b6012546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac6565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b600f5467ffffffffffffffff16811015610c27576000818152600b60205260409020546001600160a01b031615611d0d57611d0d81611b56565b80611d1781612b01565b915050611cd3565b336000818152600e602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611d9760015490565b611da19047612b42565b90506113248382611dc7866001600160a01b031660009081526003602052604090205490565b6122ad565b801580611dd95750600581115b15611e10576040517f719b10a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e25600f5467ffffffffffffffff1690565b90506005611e338383612b42565b1115611e6b576040517f62aef31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b611e778383612b42565b811015610cc157611e8884826122f0565b80611e9281612b01565b915050611e6d565b611ea5858585610c76565b6001600160a01b0384163b15611f5657604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611eeb9033908a90899089908990600401612b99565b6020604051808303816000875af1158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612b7c565b6001600160e01b03191614611f5657604051633da6393160e01b815260040160405180910390fd5b5050505050565b80471015611fad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ffa576040519150601f19603f3d011682016040523d82523d6000602084013e611fff565b606091505b5050905080610a6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6000818152600b60205260409020546001600160a01b038481169116146120c9576040517fc6de3f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166120f057604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061212d57506001600160a01b0383166000908152600e6020908152604080832033845290915290205460ff16155b801561215057506000818152600d60205260409020546001600160a01b03163314155b1561216d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038084166000818152600c60209081526040808320805460001901905593861680835284832080546001019055858352600b825284832080546001600160a01b03199081168317909155600d90925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600b60205260409020546001600160a01b03168061223257604051634d5e5fb360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600c602090815260408083208054600019019055858352600b825280832080546001600160a01b0319908116909155600d9092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b0385168252600260205260408220548391906122d49086612909565b6122de9190612920565b6122e89190612aee565b949350505050565b61099a82826122ff82826123bf565b6001600160a01b0382163b1561099a57604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190612b7c565b6001600160e01b0319161461099a57604051633da6393160e01b815260040160405180910390fd5b6123c9828261240e565b600f805467ffffffffffffffff169060006123e383612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b6001600160a01b03821661243557604051634e46966960e11b815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b031615612484576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000818152600c6020908152604080832080546001019055848352600b90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610c2757600080fd5b60006020828403121561251757600080fd5b8135611324816124ef565b6001600160a01b0381168114610c2757600080fd5b6000806040838503121561254a57600080fd5b823561255581612522565b915060208301356bffffffffffffffffffffffff8116811461257657600080fd5b809150509250929050565b60005b8381101561259c578181015183820152602001612584565b50506000910152565b60208152600082518060208401526125c4816040850160208701612581565b601f01601f19169190910160400192915050565b6000602082840312156125ea57600080fd5b5035919050565b6000806040838503121561260457600080fd5b823561260f81612522565b946020939093013593505050565b60006020828403121561262f57600080fd5b813561132481612522565b60008060006060848603121561264f57600080fd5b833561265a81612522565b9250602084013561266a81612522565b929592945050506040919091013590565b6000806040838503121561268e57600080fd5b50508035926020909101359150565b80358015158114610f1c57600080fd5b600080604083850312156126c057600080fd5b82356126cb81612522565b91506126d96020840161269d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612721576127216126e2565b604052919050565b600067ffffffffffffffff821115612743576127436126e2565b50601f01601f191660200190565b60006020828403121561276357600080fd5b813567ffffffffffffffff81111561277a57600080fd5b8201601f8101841361278b57600080fd5b803561279e61279982612729565b6126f8565b8181528560208385010111156127b357600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156127e357600080fd5b6113248261269d565b60008060008060006080868803121561280457600080fd5b853561280f81612522565b9450602086013561281f81612522565b935060408601359250606086013567ffffffffffffffff8082111561284357600080fd5b818801915088601f83011261285757600080fd5b81358181111561286657600080fd5b89602082850101111561287857600080fd5b9699959850939650602001949392505050565b6000806040838503121561289e57600080fd5b82356128a981612522565b9150602083013561257681612522565b600181811c908216806128cd57607f821691505b6020821081036128ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610982576109826128f3565b60008261293d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a6f57600081815260208120601f850160051c8101602086101561297f5750805b601f850160051c820191505b818110156111865782815560010161298b565b815167ffffffffffffffff8111156129b8576129b86126e2565b6129cc816129c684546128b9565b84612958565b602080601f831160018114612a0157600084156129e95750858301515b600019600386901b1c1916600185901b178555611186565b600085815260208120601f198616915b82811015612a3057888601518255948401946001909101908401612a11565b5085821015612a4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612a7057600080fd5b5051919050565b600060208284031215612a8957600080fd5b815167ffffffffffffffff811115612aa057600080fd5b8201601f81018413612ab157600080fd5b8051612abf61279982612729565b818152856020838501011115612ad457600080fd5b612ae5826020830160208601612581565b95945050505050565b81810381811115610982576109826128f3565b600060018201612b1357612b136128f3565b5060010190565b67ffffffffffffffff828116828216039080821115612b3b57612b3b6128f3565b5092915050565b80820180821115610982576109826128f3565b600067ffffffffffffffff808316818103612b7257612b726128f3565b6001019392505050565b600060208284031215612b8e57600080fd5b8151611324816124ef565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f8501168301019050969550505050505056fea26469706673582212202d09c116d6383ae2f23a76b108e2417c0dfd9fe69b589917566da3322e74065f64736f6c6343000813003368747470733a2f2f7777772e686172696e672e636f6d2f212f6e66742d6f776e6572736869702d6c6963656e7365
Deployed Bytecode
0x6080604052600436106103015760003560e01c806370a082311161018f578063a3f8eace116100e1578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146108f3578063f2fde38b1461092e578063fb796e6c1461094e57600080fd5b8063d5abeb011461088c578063e228c6fe146108c9578063e33b7de3146108de57600080fd5b8063b88d4fde116100bb578063b88d4fde14610816578063c87b56dd14610836578063ce7c2ac21461085657600080fd5b8063a3f8eace146107b6578063b329e732146107d6578063b7c0b8e8146107f657600080fd5b80639499e018116101435780639852595c1161011d5780639852595c1461074b578063a22cb46514610781578063a2309ff8146107a157600080fd5b80639499e0181461070157806395d89b411461071657806396a968571461072b57600080fd5b80638b83209b116101745780638b83209b146106a35780638da5cb5b146106c3578063938e3d7b146106e157600080fd5b806370a082311461066e578063715018a61461068e57600080fd5b80632b38bafc1161025357806346d8efad116101fc578063585997e3116101d6578063585997e3146104565780636352211e146106395780636c0360eb1461065957600080fd5b806346d8efad146105e45780634f44aacb146106045780634f558e791461061957600080fd5b80633a98ef391161022d5780633a98ef391461058f57806342842e0e146105a457806342966c68146105c457600080fd5b80632b38bafc1461050d57806332cb6b0c1461052d57806337929eb41461057a57600080fd5b806316348009116102b55780631a7a65371161028f5780631a7a65371461049957806323b872dd146104ae5780632a55205a146104ce57600080fd5b8063163480091461043657806318160ddd14610456578063191655871461047957600080fd5b806306fdde03116102e657806306fdde03146103a6578063081812fc146103c8578063095ea7b31461041657600080fd5b806301ffc9a71461034f57806304634d8d1461038457600080fd5b3661034a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035b57600080fd5b5061036f61036a366004612505565b610968565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b506103a461039f366004612537565b610988565b005b3480156103b257600080fd5b506103bb61099e565b60405161037b91906125a5565b3480156103d457600080fd5b506103fe6103e33660046125d8565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b34801561042257600080fd5b506103a46104313660046125f1565b610a2c565b34801561044257600080fd5b506103a461045136600461261d565b610a74565b34801561046257600080fd5b5061046b610c07565b60405190815260200161037b565b34801561048557600080fd5b506103a461049436600461261d565b610c16565b3480156104a557600080fd5b5061036f610c2a565b3480156104ba57600080fd5b506103a46104c936600461263a565b610c76565b3480156104da57600080fd5b506104ee6104e936600461267b565b610cc7565b604080516001600160a01b03909316835260208301919091520161037b565b34801561051957600080fd5b506103a461052836600461261d565b610d82565b34801561053957600080fd5b506105617f000000000000000000000000000000000000000000000000000000000000000581565b60405167ffffffffffffffff909116815260200161037b565b34801561058657600080fd5b506103bb610d93565b34801561059b57600080fd5b5060005461046b565b3480156105b057600080fd5b506103a46105bf36600461263a565b610d9d565b3480156105d057600080fd5b506103a46105df3660046125d8565b610de8565b3480156105f057600080fd5b506103a46105ff3660046126ad565b610e7d565b34801561061057600080fd5b506103a4610e8f565b34801561062557600080fd5b5061036f6106343660046125d8565b610ec7565b34801561064557600080fd5b506103fe6106543660046125d8565b610ee6565b34801561066557600080fd5b506103bb610f21565b34801561067a57600080fd5b5061046b61068936600461261d565b610f2e565b34801561069a57600080fd5b506103a4610f8c565b3480156106af57600080fd5b506103fe6106be3660046125d8565b610fa0565b3480156106cf57600080fd5b506012546001600160a01b03166103fe565b3480156106ed57600080fd5b506103a46106fc366004612751565b610fd0565b34801561070d57600080fd5b506103a4610fe4565b34801561072257600080fd5b506103bb611091565b34801561073757600080fd5b5061046b61074636600461261d565b61109e565b34801561075757600080fd5b5061046b61076636600461261d565b6001600160a01b031660009081526003602052604090205490565b34801561078d57600080fd5b506103a461079c3660046126ad565b6110a9565b3480156107ad57600080fd5b5061046b6110ec565b3480156107c257600080fd5b5061046b6107d136600461261d565b611101565b3480156107e257600080fd5b506103a46107f13660046125f1565b61110c565b34801561080257600080fd5b506103a46108113660046127d1565b61111e565b34801561082257600080fd5b506103a46108313660046127ec565b611139565b34801561084257600080fd5b506103bb6108513660046125d8565b61118e565b34801561086257600080fd5b5061046b61087136600461261d565b6001600160a01b031660009081526002602052604090205490565b34801561089857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000567ffffffffffffffff1661046b565b3480156108d557600080fd5b506103a461132b565b3480156108ea57600080fd5b5060015461046b565b3480156108ff57600080fd5b5061036f61090e36600461288b565b600e60209081526000928352604080842090915290825290205460ff1681565b34801561093a57600080fd5b506103a461094936600461261d565b611334565b34801561095a57600080fd5b5060115461036f9060ff1681565b6000610973826113c1565b80610982575061098282611441565b92915050565b61099061148f565b61099a82826114d3565b5050565b600980546109ab906128b9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d7906128b9565b8015610a245780601f106109f957610100808354040283529160200191610a24565b820191906000526020600020905b815481529060010190602001808311610a0757829003601f168201915b505050505081565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b03821614610a655760115460ff1615610a6557610a65816115ed565b610a6f8383611631565b505050565b6001600160a01b038116610acf5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207a65726f206164647265737300000060448201526064015b60405180910390fd5b33600090815260026020526040902054610b2b5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f206f776e6564207368617265736044820152606401610ac6565b6001600160a01b03811660009081526002602052604090205415610bb75760405162461bcd60e51b815260206004820152602160248201527f5061796d656e7453706c69747465723a2070617965652068617320736861726560448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610ac6565b610bc0816116f6565b7f6829b4029cd073199f80f49556d32953c9bc4e14d395388e678d2cc4604d481933604080516001600160a01b03928316815291841660208301520160405180910390a150565b6000610c116117c2565b905090565b610c1e61148f565b610c27816117f9565b50565b601154600090600160a81b900460ff1680610c6557507f00000000000000000000000000000000000000000000000000000000011687844310155b15610c705750600090565b50600190565b826001600160a01b0381163314610cb657731e0049783f008a0085193e00003d00cd54003c713314610cb65760115460ff1615610cb657610cb6336115ed565b610cc1848484611940565b50505050565b60008281526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610d465750604080518082019091526005546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610d6a906bffffffffffffffffffffffff1687612909565b610d749190612920565b915196919550909350505050565b610d8a61148f565b610c27816119ab565b6060610c116119f6565b826001600160a01b0381163314610ddd57731e0049783f008a0085193e00003d00cd54003c713314610ddd5760115460ff1615610ddd57610ddd336115ed565b610cc1848484611a88565b6000818152600b60205260409020546001600160a01b0316338114801590610e3457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b8015610e5757506000828152600d60205260409020546001600160a01b03163314155b15610e74576040516282b42960e81b815260040160405180910390fd5b61099a82611b56565b610e8561148f565b61099a8282611baf565b610e9761148f565b601180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000818152600b60205260408120546001600160a01b03161515610982565b6000818152600b60205260409020546001600160a01b031680610f1c57604051634d5e5fb360e01b815260040160405180910390fd5b919050565b601080546109ab906128b9565b60006001600160a01b038216610f70576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03166000908152600c602052604090205490565b610f94611c24565b610f9e6000611c7e565b565b600060048281548110610fb557610fb5612942565b6000918252602090912001546001600160a01b031692915050565b610fd861148f565b601061099a828261299e565b610fec61148f565b601154600160a81b900460ff1615611030576040517f4ed82f1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000011687844310611089576040517f37c3017c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9e611cd0565b600a80546109ab906128b9565b600061098282610f2e565b81731e0049783f008a0085193e00003d00cd54003c716001600160a01b038216146110e25760115460ff16156110e2576110e2816115ed565b610a6f8383611d1f565b6000610c11600f5467ffffffffffffffff1690565b600061098282611d8b565b61111461148f565b61099a8282611dcc565b61112661148f565b6011805460ff1916911515919091179055565b846001600160a01b038116331461117957731e0049783f008a0085193e00003d00cd54003c7133146111795760115460ff161561117957611179336115ed565b6111868686868686611e9a565b505050505050565b6000818152600b60205260409020546060906001600160a01b03166111f55760405162461bcd60e51b815260206004820152600860248201527f4e6f20746f6b656e0000000000000000000000000000000000000000000000006044820152606401610ac6565b6011546040517fdf9329ad0000000000000000000000000000000000000000000000000000000081526004810184905260009161010090046001600160a01b03169063df9329ad90602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612a5e565b60115490915061010090046001600160a01b03166040517f6325520600000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b039190911690636325520690604401600060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113249190810190612a77565b9392505050565b610f9e336117f9565b61133c611c24565b6001600160a01b0381166113b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac6565b610c2781611c7e565b60006301ffc9a760e01b6001600160e01b03198316148061140b57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806109825750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061098257506301ffc9a760e01b6001600160e01b0319831614610982565b6012546001600160a01b03163314610f9e576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127106bffffffffffffffffffffffff821611156115595760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610ac6565b6001600160a01b0382166115af5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610ac6565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600555565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa611629573d6000803e3d6000fd5b6000603a5250565b6000818152600b60205260409020546001600160a01b031633811480159061167d57506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff16155b1561169a576040516282b42960e81b815260040160405180910390fd5b6000828152600d602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6004546000036117035750565b60005b60045461171590600190612aee565b81101561099a57336001600160a01b03166004828154811061173957611739612942565b6000918252602090912001546001600160a01b0316036117b057816004828154811061176757611767612942565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905533808352600290915260408083208054948716845290832093909355815290555b806117ba81612b01565b915050611706565b600f546000906117ea9067ffffffffffffffff68010000000000000000820481169116612b1a565b67ffffffffffffffff16905090565b6001600160a01b03811660009081526002602052604090205461185e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207368617265730000000000006044820152606401610ac6565b600061186982611d8b565b9050806000036118bb5760405162461bcd60e51b815260206004820181905260248201527f5061796d656e7453706c69747465723a206e6f7420647565207061796d656e746044820152606401610ac6565b80600160008282546118cd9190612b42565b90915550506001600160a01b03821660009081526003602052604090208054820190556118fa8282611f5d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b61194b838383612076565b6001600160a01b038216610a6f57600f805468010000000000000000900467ffffffffffffffff1690600861197f83612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b6001600160a01b03811615610c2757601180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90911617905550565b606060108054611a05906128b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a31906128b9565b8015611a7e5780601f10611a5357610100808354040283529160200191611a7e565b820191906000526020600020905b815481529060010190602001808311611a6157829003601f168201915b5050505050905090565b611a93838383610c76565b6001600160a01b0382163b15610a6f57604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190612b7c565b6001600160e01b03191614610a6f57604051633da6393160e01b815260040160405180910390fd5b611b5f816121fc565b600f805468010000000000000000900467ffffffffffffffff16906008611b8583612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b6001600160a01b0390911690637d3e3dbe81611bdc5782611bd55750634420e486611bdc565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af1611c1a578060005160e01c03611c1a57600080fd5b5060006024525050565b6012546001600160a01b03163314610f9e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac6565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b600f5467ffffffffffffffff16811015610c27576000818152600b60205260409020546001600160a01b031615611d0d57611d0d81611b56565b80611d1781612b01565b915050611cd3565b336000818152600e602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611d9760015490565b611da19047612b42565b90506113248382611dc7866001600160a01b031660009081526003602052604090205490565b6122ad565b801580611dd95750600581115b15611e10576040517f719b10a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e25600f5467ffffffffffffffff1690565b90506005611e338383612b42565b1115611e6b576040517f62aef31000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b611e778383612b42565b811015610cc157611e8884826122f0565b80611e9281612b01565b915050611e6d565b611ea5858585610c76565b6001600160a01b0384163b15611f5657604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611eeb9033908a90899089908990600401612b99565b6020604051808303816000875af1158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612b7c565b6001600160e01b03191614611f5657604051633da6393160e01b815260040160405180910390fd5b5050505050565b80471015611fad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610ac6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ffa576040519150601f19603f3d011682016040523d82523d6000602084013e611fff565b606091505b5050905080610a6f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610ac6565b6000818152600b60205260409020546001600160a01b038481169116146120c9576040517fc6de3f2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166120f057604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061212d57506001600160a01b0383166000908152600e6020908152604080832033845290915290205460ff16155b801561215057506000818152600d60205260409020546001600160a01b03163314155b1561216d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038084166000818152600c60209081526040808320805460001901905593861680835284832080546001019055858352600b825284832080546001600160a01b03199081168317909155600d90925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600b60205260409020546001600160a01b03168061223257604051634d5e5fb360e01b815260040160405180910390fd5b6001600160a01b0381166000818152600c602090815260408083208054600019019055858352600b825280832080546001600160a01b0319908116909155600d9092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b0385168252600260205260408220548391906122d49086612909565b6122de9190612920565b6122e89190612aee565b949350505050565b61099a82826122ff82826123bf565b6001600160a01b0382163b1561099a57604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190612b7c565b6001600160e01b0319161461099a57604051633da6393160e01b815260040160405180910390fd5b6123c9828261240e565b600f805467ffffffffffffffff169060006123e383612b55565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b6001600160a01b03821661243557604051634e46966960e11b815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b031615612484576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000818152600c6020908152604080832080546001019055848352600b90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610c2757600080fd5b60006020828403121561251757600080fd5b8135611324816124ef565b6001600160a01b0381168114610c2757600080fd5b6000806040838503121561254a57600080fd5b823561255581612522565b915060208301356bffffffffffffffffffffffff8116811461257657600080fd5b809150509250929050565b60005b8381101561259c578181015183820152602001612584565b50506000910152565b60208152600082518060208401526125c4816040850160208701612581565b601f01601f19169190910160400192915050565b6000602082840312156125ea57600080fd5b5035919050565b6000806040838503121561260457600080fd5b823561260f81612522565b946020939093013593505050565b60006020828403121561262f57600080fd5b813561132481612522565b60008060006060848603121561264f57600080fd5b833561265a81612522565b9250602084013561266a81612522565b929592945050506040919091013590565b6000806040838503121561268e57600080fd5b50508035926020909101359150565b80358015158114610f1c57600080fd5b600080604083850312156126c057600080fd5b82356126cb81612522565b91506126d96020840161269d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612721576127216126e2565b604052919050565b600067ffffffffffffffff821115612743576127436126e2565b50601f01601f191660200190565b60006020828403121561276357600080fd5b813567ffffffffffffffff81111561277a57600080fd5b8201601f8101841361278b57600080fd5b803561279e61279982612729565b6126f8565b8181528560208385010111156127b357600080fd5b81602084016020830137600091810160200191909152949350505050565b6000602082840312156127e357600080fd5b6113248261269d565b60008060008060006080868803121561280457600080fd5b853561280f81612522565b9450602086013561281f81612522565b935060408601359250606086013567ffffffffffffffff8082111561284357600080fd5b818801915088601f83011261285757600080fd5b81358181111561286657600080fd5b89602082850101111561287857600080fd5b9699959850939650602001949392505050565b6000806040838503121561289e57600080fd5b82356128a981612522565b9150602083013561257681612522565b600181811c908216806128cd57607f821691505b6020821081036128ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610982576109826128f3565b60008261293d57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b601f821115610a6f57600081815260208120601f850160051c8101602086101561297f5750805b601f850160051c820191505b818110156111865782815560010161298b565b815167ffffffffffffffff8111156129b8576129b86126e2565b6129cc816129c684546128b9565b84612958565b602080601f831160018114612a0157600084156129e95750858301515b600019600386901b1c1916600185901b178555611186565b600085815260208120601f198616915b82811015612a3057888601518255948401946001909101908401612a11565b5085821015612a4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612a7057600080fd5b5051919050565b600060208284031215612a8957600080fd5b815167ffffffffffffffff811115612aa057600080fd5b8201601f81018413612ab157600080fd5b8051612abf61279982612729565b818152856020838501011115612ad457600080fd5b612ae5826020830160208601612581565b95945050505050565b81810381811115610982576109826128f3565b600060018201612b1357612b136128f3565b5060010190565b67ffffffffffffffff828116828216039080821115612b3b57612b3b6128f3565b5092915050565b80820180821115610982576109826128f3565b600067ffffffffffffffff808316818103612b7257612b726128f3565b6001019392505050565b600060208284031215612b8e57600080fd5b8151611324816124ef565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f8501168301019050969550505050505056fea26469706673582212202d09c116d6383ae2f23a76b108e2417c0dfd9fe69b589917566da3322e74065f64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.