Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 319 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20964027 | 40 days ago | IN | 0 ETH | 0.00144371 | ||||
Safe Transfer Fr... | 20948183 | 42 days ago | IN | 0 ETH | 0.00050667 | ||||
Transfer Ownersh... | 20520344 | 102 days ago | IN | 0 ETH | 0.00008754 | ||||
Withdraw | 20520302 | 102 days ago | IN | 0 ETH | 0.0000937 | ||||
Claim | 19059507 | 306 days ago | IN | 0 ETH | 0.00097983 | ||||
Set Approval For... | 18550135 | 377 days ago | IN | 0 ETH | 0.00275174 | ||||
Set Approval For... | 17685012 | 499 days ago | IN | 0 ETH | 0.00070626 | ||||
Set Approval For... | 17431836 | 534 days ago | IN | 0 ETH | 0.00083189 | ||||
Set Approval For... | 17373614 | 542 days ago | IN | 0 ETH | 0.00135619 | ||||
Set Approval For... | 17373582 | 542 days ago | IN | 0 ETH | 0.00124963 | ||||
Set Approval For... | 17373575 | 542 days ago | IN | 0 ETH | 0.00119552 | ||||
Set Approval For... | 17373556 | 542 days ago | IN | 0 ETH | 0.00219862 | ||||
Set Approval For... | 17313570 | 551 days ago | IN | 0 ETH | 0.00076726 | ||||
Set Approval For... | 17091714 | 582 days ago | IN | 0 ETH | 0.00111519 | ||||
Set Approval For... | 17026471 | 591 days ago | IN | 0 ETH | 0.0007326 | ||||
Set Approval For... | 16998032 | 595 days ago | IN | 0 ETH | 0.00080977 | ||||
Claim | 16987426 | 597 days ago | IN | 0 ETH | 0.00335577 | ||||
Set Approval For... | 16982337 | 598 days ago | IN | 0 ETH | 0.00068446 | ||||
Set Approval For... | 16981083 | 598 days ago | IN | 0 ETH | 0.00072945 | ||||
Set Approval For... | 16974335 | 599 days ago | IN | 0 ETH | 0.00049694 | ||||
Claim | 16971417 | 599 days ago | IN | 0 ETH | 0.00237616 | ||||
Set Approval For... | 16967491 | 600 days ago | IN | 0 ETH | 0.00050807 | ||||
Airdrop | 16954822 | 602 days ago | IN | 0 ETH | 0.00214964 | ||||
Mint Public | 16931752 | 605 days ago | IN | 0.03 ETH | 0.00157608 | ||||
Claim | 16921390 | 606 days ago | IN | 0 ETH | 0.00300858 |
Loading...
Loading
Contract Name:
BBCLUB
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; import '../EthereumContracts/contracts/NFT/NFTBaseC.sol'; import '../EthereumContracts/contracts/utils/IWhitelistable_ECDSA.sol'; contract BBCLUB is NFTBaseC, IWhitelistable_ECDSA { uint8 public constant PRIVATE_SALE = 2; uint8 public constant PRE_SALE = 3; uint8 public constant CLAIM = 4; constructor( uint256 reserve_, uint256 maxBatch_, uint256 maxSupply_ ) { _initNFTBaseC( reserve_, maxBatch_, maxSupply_, 30000000000000000, 500, "Bush Baby Club", "BUSH", "https://api.bushbabyclub.io/metadata?tokenId=" ); } modifier isPrivateOrPreSale { uint8 _currentState_ = getPauseState(); if ( _currentState_ != PRIVATE_SALE && _currentState_ != PRE_SALE ) { revert IPausable_INCORRECT_STATE( _currentState_ ); } _; } modifier isPreSale { uint8 _currentState_ = getPauseState(); if ( _currentState_ != PRE_SALE ) { revert IPausable_INCORRECT_STATE( _currentState_ ); } _; } // ************************************** // ***** PUBLIC ***** // ************************************** function claim( uint256 alloted_, Proof memory proof_, uint256 qty_ ) public validateAmount( qty_ ) isNotClosed isWhitelisted( _msgSender(), CLAIM, alloted_, proof_, qty_ ) { address _account_ = _msgSender(); if ( _reserve < qty_ ) { revert NFT_MAX_RESERVE( qty_, _reserve ); } unchecked { _reserve -= qty_; } _consumeWhitelist( _account_, CLAIM, qty_ ); _mint( _account_, qty_ ); } function mintPreSale( uint256 alloted_, Proof memory proof_, uint256 qty_ ) public payable validateAmount( qty_ ) isPreSale isWhitelisted( _msgSender(), PRE_SALE, alloted_, proof_, qty_ ) { uint256 _remainingSupply_ = MAX_SUPPLY - _reserve - supplyMinted(); if ( qty_ > _remainingSupply_ ) { revert NFT_MAX_SUPPLY( qty_, _remainingSupply_ ); } uint256 _expected_ = qty_ * SALE_PRICE; if ( _expected_ != msg.value ) { revert NFT_INCORRECT_PRICE( msg.value, _expected_ ); } address _account_ = _msgSender(); _consumeWhitelist( _account_, PRE_SALE, qty_ ); _mint( _account_, qty_ ); } function mintPrivateSale( uint256 alloted_, Proof memory proof_, uint256 qty_ ) public payable validateAmount( qty_ ) isPrivateOrPreSale isWhitelisted( _msgSender(), PRIVATE_SALE, alloted_, proof_, qty_ ) { uint256 _remainingSupply_ = MAX_SUPPLY - _reserve - supplyMinted(); if ( qty_ > _remainingSupply_ ) { revert NFT_MAX_SUPPLY( qty_, _remainingSupply_ ); } uint256 _expected_ = qty_ * SALE_PRICE; if ( _expected_ != msg.value ) { revert NFT_INCORRECT_PRICE( msg.value, _expected_ ); } address _account_ = _msgSender(); _consumeWhitelist( _account_, PRIVATE_SALE, qty_ ); _mint( _account_, qty_ ); } // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** function setWhitelist( address adminSigner_ ) public onlyOwner { _setWhitelist( adminSigner_ ); } // ************************************** }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White * Edit : Squeebo */ pragma solidity 0.8.10; abstract contract IWhitelistable_ECDSA { // A constant encoded into the proof. To allow expandability of uses for the whitelist, it is kept constant instead of implemented as enum. uint8 public constant DEFAULT_WHITELIST = 1; // Errors error IWhitelistable_NOT_SET(); error IWhitelistable_CONSUMED( address account ); error IWhitelistable_FORBIDDEN( address account ); struct Proof { bytes32 r; bytes32 s; uint8 v; } address private _adminSigner; mapping( uint8 => mapping ( address => uint256 ) ) private _consumed; modifier isWhitelisted( address account_, uint8 whitelistType_, uint256 alloted_, Proof memory proof_, uint256 qty_ ) { uint256 _allowed_ = checkWhitelistAllowance( account_, whitelistType_, alloted_, proof_ ); if ( _allowed_ < qty_ ) { revert IWhitelistable_FORBIDDEN( account_ ); } _; } /** * @dev Sets the pass to protect the whitelist. */ function _setWhitelist( address adminSigner_ ) internal virtual { _adminSigner = adminSigner_; } /** * @dev Returns the amount that `account_` is allowed to access from the whitelist. * * Requirements: * * - `_adminSigner` must be set. */ function checkWhitelistAllowance( address account_, uint8 whitelistType_, uint256 alloted_, Proof memory proof_ ) public view returns ( uint256 ) { if ( _adminSigner == address( 0 ) ) { revert IWhitelistable_NOT_SET(); } if ( _consumed[ whitelistType_ ][ account_ ] >= alloted_ ) { revert IWhitelistable_CONSUMED( account_ ); } bytes32 _digest_ = keccak256( abi.encode( whitelistType_, alloted_, account_ ) ); if ( ! _validateProof( _digest_, proof_ ) ) { revert IWhitelistable_FORBIDDEN( account_ ); } return alloted_ - _consumed[ whitelistType_ ][ account_ ]; } function _validateProof( bytes32 digest_, Proof memory proof_ ) private view returns ( bool ) { address _signer_ = ecrecover( digest_, proof_.v, proof_.r, proof_.s ); return _signer_ == _adminSigner; } /** * @dev Consumes `amount_` pass passes from `account_`. * * Note: Before calling this function, eligibility should be checked through {IWhitelistable-checkWhitelistAllowance}. */ function _consumeWhitelist( address account_, uint8 whitelistType_, uint256 qty_ ) internal { unchecked { _consumed[ whitelistType_ ][ account_ ] += qty_; } } }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; import '../tokens/ERC721/Consec_ERC721Batch.sol'; import '../utils/IOwnable.sol'; import '../utils/IPausable.sol'; import '../utils/ITradable.sol'; import '../utils/ERC2981Base.sol'; abstract contract NFTBaseC is Consec_ERC721Batch, IOwnable, IPausable, ITradable, ERC2981Base { // Errors error NFT_ARRAY_LENGTH_MISMATCH( uint256 len1, uint256 len2 ); error NFT_INCORRECT_PRICE( uint256 amountReceived, uint256 amountExpected ); error NFT_INVALID_QTY(); error NFT_INVALID_SHARE(); error NFT_INVALID_TEAM_MEMBER( address account ); error NFT_MAX_BATCH( uint256 qtyRequested, uint256 maxBatch ); error NFT_MAX_RESERVE( uint256 qtyRequested, uint256 reserveLeft ); error NFT_MAX_SUPPLY( uint256 qtyRequested, uint256 remainingSupply ); error NFT_MISSING_SHARES( uint256 missingShares ); error NFT_NO_ETHER_BALANCE(); error NFT_ETHER_TRANSFER_FAIL( address to, uint256 amount ); // Events event PaymentReleased( address to, uint256 amount ); uint256 private constant SHARE_BASE = 10000; uint256 public MAX_SUPPLY; uint256 public MAX_BATCH; uint256 public SALE_PRICE; uint256 internal _reserve; uint256[] private _teamShares; address[] private _teamAddresses; /** * @dev Ensures that `qty_` is higher than 0 * * @param qty_ : the amount to validate */ modifier validateAmount( uint256 qty_ ) { if ( qty_ == 0 ) { revert NFT_INVALID_QTY(); } _; } // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Internal function to initialize the NFT contract. * * @param reserve_ : total amount of reserved tokens for airdrops * @param maxBatch_ : maximum quantity of token that can be minted in one transaction * @param maxSupply_ : maximum number of tokens that can exist * @param salePrice_ : sale price of the tokens * @param royaltyRate_ : portion of the secondary sale that will be paid out to the collection, out of 10,000 total shares * @param name_ : name of the token * @param symbol_ : symbol representing the token * @param baseURI_ : baseURI for the tokens * * Requirements: * * - `teamShares_` and `teamAddresses_` must have the same length * - no element of `teamShares_` can be 0 * - no element of `teamAddresses_` can be a contract address * - the sum of `teamShares_` must be 1,000 */ function _initNFTBaseC ( uint256 reserve_, uint256 maxBatch_, uint256 maxSupply_, uint256 salePrice_, uint256 royaltyRate_, string memory name_, string memory symbol_, string memory baseURI_ ) internal { _initERC721Metadata( name_, symbol_, baseURI_ ); _initIOwnable( _msgSender() ); _initERC2981Base( _msgSender(), royaltyRate_ ); MAX_SUPPLY = maxSupply_; MAX_BATCH = maxBatch_; SALE_PRICE = salePrice_; _reserve = reserve_; } /** * @dev Internal function returning whether `operator_` is allowed to manage tokens on behalf of `tokenOwner_`. * * @param tokenOwner_ : address that owns tokens * @param operator_ : address that tries to manage tokens * * @return bool whether `operator_` is allowed to manage the token */ function _isApprovedForAll( address tokenOwner_, address operator_ ) internal view virtual override(Consec_ERC721Batch) returns ( bool ) { return _isRegisteredProxy( tokenOwner_, operator_ ) || super._isApprovedForAll( tokenOwner_, operator_ ); } /** * @dev Internal function returning whether `addr_` is a contract. * Note this function will be inacurate if `addr_` is a contract in deployment. * * @param addr_ : address to be verified * * @return bool whether `addr_` is a fully deployed contract */ function _isContract( address addr_ ) internal view returns ( bool ) { uint size; assembly { size := extcodesize( addr_ ) } return size > 0; } // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /** * @dev Mints `qty_` tokens and transfers them to the caller. * * Requirements: * * - Sale state must be {SaleState.SALE}. * - There must be enough tokens left to mint outside of the reserve. * - Caller must send enough ether to pay for `qty_` tokens at public sale price. * * @param qty_ : the amount of tokens to be minted */ function mintPublic( uint256 qty_ ) public payable validateAmount( qty_ ) isOpen { if ( qty_ > MAX_BATCH ) { revert NFT_MAX_BATCH( qty_, MAX_BATCH ); } uint256 _remainingSupply_ = MAX_SUPPLY - _reserve - supplyMinted(); if ( qty_ > _remainingSupply_ ) { revert NFT_MAX_SUPPLY( qty_, _remainingSupply_ ); } uint256 _expected_ = qty_ * SALE_PRICE; if ( _expected_ != msg.value ) { revert NFT_INCORRECT_PRICE( msg.value, _expected_ ); } _mint( _msgSender(), qty_ ); } // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /** * @dev See {ITradable-addProxyRegistry}. * * @param proxyRegistryAddress_ : the address of the proxy registry to be added * * Requirements: * * - Caller must be the contract owner. */ function addProxyRegistry( address proxyRegistryAddress_ ) external onlyOwner { _addProxyRegistry( proxyRegistryAddress_ ); } /** * @dev See {ITradable-removeProxyRegistry}. * * @param proxyRegistryAddress_ : the address of the proxy registry to be removed * * Requirements: * * - Caller must be the contract owner. */ function removeProxyRegistry( address proxyRegistryAddress_ ) external onlyOwner { _removeProxyRegistry( proxyRegistryAddress_ ); } /** * @dev Mints `amounts_` tokens and transfers them to `accounts_`. * * @param accounts_ : the list of accounts that will receive airdropped tokens * @param amounts_ : the amount of tokens each account in `accounts_` will receive * * Requirements: * * - Caller must be the contract owner. * - `accounts_` and `amounts_` must have the same length. * - There must be enough tokens left in the reserve. */ function airdrop( address[] memory accounts_, uint256[] memory amounts_ ) public onlyOwner { uint256 _accountsLen_ = accounts_.length; uint256 _amountsLen_ = amounts_.length; if ( _accountsLen_ != _amountsLen_ ) { revert NFT_ARRAY_LENGTH_MISMATCH( _accountsLen_, _amountsLen_ ); } uint256 _totalQty_; for ( uint256 i = _amountsLen_; i > 0; i -- ) { _totalQty_ += amounts_[ i - 1 ]; } if ( _totalQty_ > _reserve ) { revert NFT_MAX_RESERVE( _totalQty_, _reserve ); } unchecked { _reserve -= _totalQty_; } for ( uint256 i; i < _accountsLen_; i ++ ) { _mint( accounts_[ i ], amounts_[ i ] ); } } /** * @dev Updates the baseURI for the tokens. * * @param baseURI_ : the new baseURI for the tokens * * Requirements: * * - Caller must be the contract owner. */ function setBaseURI( string memory baseURI_ ) public onlyOwner { _setBaseURI( baseURI_ ); } /** * @dev Updates the royalty recipient and rate. * * @param royaltyRecipient_ : the new recipient of the royalties * @param royaltyRate_ : the new royalty rate * * Requirements: * * - Caller must be the contract owner * - `royaltyRate_` cannot be higher than 10,000 */ function setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) external onlyOwner { _setRoyaltyInfo( royaltyRecipient_, royaltyRate_ ); } /** * @dev See {IPausable-setPauseState}. * * @param newState_ : the new sale state * * Requirements: * * - Caller must be the contract owner. */ function setPauseState( uint8 newState_ ) external onlyOwner { _setPauseState( newState_ ); } /** * @dev Withdraws all the money stored in the contract and splits it amongst the set wallets. * * Requirements: * * - Caller must be the contract owner. * - Contract must have a positive balance. */ function withdraw() public onlyOwner { uint256 _balance_ = address( this ).balance; if ( _balance_ == 0 ) { revert NFT_NO_ETHER_BALANCE(); } address _recipient_ = payable( _msgSender() ); ( bool _success_, ) = _recipient_.call{ value: _balance_ }( "" ); if ( ! _success_ ) { revert NFT_ETHER_TRANSFER_FAIL( _recipient_, _balance_ ); } emit PaymentReleased( _recipient_, _balance_ ); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** function supportsInterface( bytes4 interfaceId_ ) public view virtual override(Consec_ERC721Batch, ERC2981Base) returns ( bool ) { return ERC2981Base.supportsInterface( interfaceId_ ) || Consec_ERC721Batch.supportsInterface( interfaceId_ ); } // ************************************** }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; import "../interfaces/IERC2981.sol"; import "../interfaces/IERC165.sol"; abstract contract ERC2981Base is IERC165, IERC2981 { // Errors error IERC2981_INVALID_ROYALTIES( uint256 royaltyRate, uint256 royaltyBase ); // Royalty rate is stored out of 10,000 instead of a percentage to allow for // up to two digits below the unit such as 2.5% or 1.25%. uint private constant ROYALTY_BASE = 10000; // Represents the percentage of royalties on each sale on secondary markets. // Set to 0 to have no royalties. uint256 private _royaltyRate; // Address of the recipient of the royalties. address private _royaltyRecipient; function _initERC2981Base( address royaltyRecipient_, uint256 royaltyRate_ ) internal { _setRoyaltyInfo( royaltyRecipient_, royaltyRate_ ); } /** * @dev See {IERC2981-royaltyInfo}. * * Note: This function should be overriden to revert on a query for non existent token. */ function royaltyInfo( uint256, uint256 salePrice_ ) public view virtual override returns ( address, uint256 ) { if ( salePrice_ == 0 || _royaltyRate == 0 ) { return ( _royaltyRecipient, 0 ); } uint256 _royaltyAmount_ = _royaltyRate * salePrice_ / ROYALTY_BASE; return ( _royaltyRecipient, _royaltyAmount_ ); } /** * @dev Sets the royalty rate to `royaltyRate_` and the royalty recipient to `royaltyRecipient_`. * * Requirements: * * - `royaltyRate_` cannot be higher than `ROYALTY_BASE`; */ function _setRoyaltyInfo( address royaltyRecipient_, uint256 royaltyRate_ ) internal virtual { if ( royaltyRate_ > ROYALTY_BASE ) { revert IERC2981_INVALID_ROYALTIES( royaltyRate_, ROYALTY_BASE ); } _royaltyRate = royaltyRate_; _royaltyRecipient = royaltyRecipient_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId_ ) public view virtual override returns ( bool ) { return interfaceId_ == type( IERC2981 ).interfaceId || interfaceId_ == type( IERC165 ).interfaceId; } }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; contract OwnableDelegateProxy {} contract ProxyRegistry { mapping( address => OwnableDelegateProxy ) public proxies; } abstract contract ITradable { // OpenSea proxy registry address address[] internal _proxyRegistries; /** * @dev Internal function that adds a proxy registry to the list of accepted proxy registries. */ function _addProxyRegistry( address proxyRegistryAddress_ ) internal { uint256 _index_ = _proxyRegistries.length; while ( _index_ > 0 ) { unchecked { _index_ --; } if ( _proxyRegistries[ _index_ ] == proxyRegistryAddress_ ) { return; } } _proxyRegistries.push( proxyRegistryAddress_ ); } /** * @dev Internal function that removes a proxy registry from the list of accepted proxy registries. */ function _removeProxyRegistry( address proxyRegistryAddress_ ) internal { uint256 _len_ = _proxyRegistries.length; uint256 _index_ = _len_; while ( _index_ > 0 ) { unchecked { _index_ --; } if ( _proxyRegistries[ _index_ ] == proxyRegistryAddress_ ) { if ( _index_ + 1 != _len_ ) { _proxyRegistries[ _index_ ] = _proxyRegistries[ _len_ - 1 ]; } _proxyRegistries.pop(); } return; } } /** * @dev Checks if `operator_` is a registered proxy for `tokenOwner_`. * * Note: Use this function to allow whitelisting of registered proxy. */ function _isRegisteredProxy( address tokenOwner_, address operator_ ) internal view returns ( bool ) { uint256 _index_ = _proxyRegistries.length; while ( _index_ > 0 ) { unchecked { _index_ --; } ProxyRegistry _proxyRegistry_ = ProxyRegistry( _proxyRegistries[ _index_ ] ); if ( address( _proxyRegistry_.proxies( tokenOwner_ ) ) == operator_ ) { return true; } } return false; } }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; abstract contract IPausable { // Enum to represent the sale state, defaults to ``CLOSED``. uint8 constant CLOSED = 0; uint8 constant OPEN = 1; // Errors error IPausable_INCORRECT_STATE( uint8 currentState ); error IPausable_INVALID_STATE( uint8 newState ); // The current state of the contract uint8 private _contractState; /** * @dev Emitted when the sale state changes */ event ContractStateChanged( uint8 indexed previousState, uint8 indexed newState ); /** * @dev Internal function setting the contract state to `newState_`. * * Note: Contract state can have one of 2 values by default, ``CLOSED`` or ``OPEN``. * To maintain extendability, the 2 available states are kept as uint8 instead of enum. * As a result, it is possible to set the state to an incorrect value. * To avoid issues, `newState_` should be validated before calling this function */ function _setPauseState( uint8 newState_ ) internal virtual { uint8 _previousState_ = _contractState; _contractState = newState_; emit ContractStateChanged( _previousState_, newState_ ); } /** * @dev Internal function returning the contract state. */ function getPauseState() public virtual view returns ( uint8 ) { return _contractState; } /** * @dev Throws if sale state is not ``CLOSED``. */ modifier isClosed { if ( _contractState != CLOSED ) { revert IPausable_INCORRECT_STATE( _contractState ); } _; } /** * @dev Throws if sale state is ``CLOSED``. */ modifier isNotClosed { if ( _contractState == CLOSED ) { revert IPausable_INCORRECT_STATE( _contractState ); } _; } /** * @dev Throws if sale state is not ``OPEN``. */ modifier isOpen { if ( _contractState != OPEN ) { revert IPausable_INCORRECT_STATE( _contractState ); } _; } /** * @dev Throws if sale state is ``OPEN``. */ modifier isNotOpen { if ( _contractState == OPEN ) { revert IPausable_INCORRECT_STATE( _contractState ); } _; } }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; import "@openzeppelin/contracts/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 IOwnable is Context { // Errors error IOwnable_NOT_OWNER( address operator ); // The owner of the contract address private _owner; /** * @dev Emitted when contract ownership changes. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function _initIOwnable( address owner_ ) internal { _owner = owner_; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns ( address ) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { address _sender_ = _msgSender(); if ( owner() != _sender_ ) { revert IOwnable_NOT_OWNER( _sender_ ); } _; } /** * @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 { address _oldOwner_ = _owner; _owner = newOwner_; emit OwnershipTransferred( _oldOwner_, newOwner_ ); } }
// SPDX-License-Identifier: MIT /** * Author: Lambdalf the White */ pragma solidity 0.8.10; import "../../interfaces/IERC721Enumerable.sol"; import "../../interfaces/IERC721Metadata.sol"; import "../../interfaces/IERC721Receiver.sol"; import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ abstract contract Consec_ERC721Batch is Context, IERC721Metadata, IERC721Enumerable { /** * @dev See EIP2309 https://eips.ethereum.org/EIPS/eip-2309 */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed fromAddress, address indexed toAddress); // Errors error IERC721_CALLER_NOT_APPROVED( address tokenOwner, address operator, uint256 tokenId ); error IERC721_NONEXISTANT_TOKEN( uint256 tokenId ); error IERC721_NON_ERC721_RECEIVER( address receiver ); error IERC721_INVALID_APPROVAL( address operator ); error IERC721_INVALID_TRANSFER( address recipient ); error IERC721Enumerable_INDEX_OUT_OF_BOUNDS( uint256 index ); error IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS( address tokenOwner, uint256 index ); uint256 private _nextId = 1; string public name; string public symbol; // Mapping from token ID to approved address mapping( uint256 => address ) public getApproved; // Mapping from owner to operator approvals mapping( address => mapping( address => bool ) ) private _operatorApprovals; // List of owner addresses mapping( uint256 => address ) private _owners; // Token Base URI string private _baseURI; /** * @dev Ensures the token exist. * A token exists if it has been minted and is not owned by the null address. * * @param tokenId_ uint256 ID of the token to verify */ modifier exists( uint256 tokenId_ ) { if ( ! _exists( tokenId_ ) ) { revert IERC721_NONEXISTANT_TOKEN( tokenId_ ); } _; } // ************************************** // ***** INTERNAL ***** // ************************************** /** * @dev Internal function returning the number of tokens in `tokenOwner_`'s account. */ function _balanceOf( address tokenOwner_ ) internal view virtual returns ( uint256 ) { if ( tokenOwner_ == address( 0 ) ) { return 0; } uint256 _count_ = 0; address _currentTokenOwner_; for ( uint256 i = 1; i < _nextId; ++ i ) { if ( _exists( i ) ) { if ( _owners[ i ] != address( 0 ) ) { _currentTokenOwner_ = _owners[ i ]; } if ( tokenOwner_ == _currentTokenOwner_ ) { _count_++; } } } return _count_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from_ address representing the previous owner of the given token ID * @param to_ target address that will receive the tokens * @param tokenId_ uint256 ID of the token to be transferred * @param data_ bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from_, address to_, uint256 tokenId_, bytes memory data_ ) internal virtual returns ( bool ) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // // IMPORTANT // It is unsafe to assume that an address not flagged by this method // is an externally-owned account (EOA) and not a contract. // // Among others, the following types of addresses will not be flagged: // // - 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 uint256 _size_; assembly { _size_ := extcodesize( to_ ) } // If address is a contract, check that it is aware of how to handle ERC721 tokens if ( _size_ > 0 ) { try IERC721Receiver( to_ ).onERC721Received( _msgSender(), from_, tokenId_, data_ ) returns ( bytes4 retval ) { return retval == IERC721Receiver.onERC721Received.selector; } catch ( bytes memory reason ) { if ( reason.length == 0 ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } else { assembly { revert( add( 32, reason ), mload( reason ) ) } } } } else { return true; } } /** * @dev Internal function returning whether a token exists. * A token exists if it has been minted and is not owned by the null address. * * @param tokenId_ uint256 ID of the token to verify * * @return bool whether the token exists */ function _exists( uint256 tokenId_ ) internal view virtual returns ( bool ) { if ( tokenId_ == 0 ) { return false; } return tokenId_ < _nextId; } /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function _initERC721Metadata( string memory name_, string memory symbol_, string memory baseURI_ ) internal { name = name_; symbol = symbol_; _baseURI = baseURI_; } /** * @dev Internal function returning whether `operator_` is allowed * to manage tokens on behalf of `tokenOwner_`. * * @param tokenOwner_ address that owns tokens * @param operator_ address that tries to manage tokens * * @return bool whether `operator_` is allowed to handle the token */ function _isApprovedForAll( address tokenOwner_, address operator_ ) internal view virtual returns ( bool ) { return _operatorApprovals[ tokenOwner_ ][ operator_ ]; } /** * @dev Internal function returning whether `operator_` is allowed to handle `tokenId_` * * Note: To avoid multiple checks for the same data, it is assumed that existence of `tokeId_` * has been verified prior via {_exists} * If it hasn't been verified, this function might panic * * @param operator_ address that tries to handle the token * @param tokenId_ uint256 ID of the token to be handled * * @return bool whether `operator_` is allowed to handle the token */ function _isApprovedOrOwner( address tokenOwner_, address operator_, uint256 tokenId_ ) internal view virtual returns ( bool ) { bool _isApproved_ = operator_ == tokenOwner_ || operator_ == getApproved[ tokenId_ ] || _isApprovedForAll( tokenOwner_, operator_ ); return _isApproved_; } /** * @dev Mints `qty_` tokens and transfers them to `to_`. * * This internal function can be used to perform token minting. * * Emits one or more {Transfer} event. */ function _mint( address to_, uint256 qty_ ) internal virtual { uint256 _firstToken_ = _nextId; uint256 _nextStart_ = _firstToken_ + qty_; uint256 _lastToken_ = _nextStart_ - 1; _owners[ _firstToken_ ] = to_; if ( _lastToken_ > _firstToken_ ) { _owners[ _lastToken_ ] = to_; } _nextId = _nextStart_; if ( ! _checkOnERC721Received( address( 0 ), to_, _firstToken_, "" ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } emit ConsecutiveTransfer( _firstToken_, _lastToken_, address( 0 ), to_ ); } /** * @dev Internal function returning the owner of the `tokenId_` token. * * @param tokenId_ uint256 ID of the token to verify * * @return address the address of the token owner */ function _ownerOf( uint256 tokenId_ ) internal view virtual returns ( address ) { uint256 _tokenId_ = tokenId_; address _tokenOwner_ = _owners[ _tokenId_ ]; while ( _tokenOwner_ == address( 0 ) ) { _tokenId_ --; _tokenOwner_ = _owners[ _tokenId_ ]; } return _tokenOwner_; } /** * @dev Internal function used to set the base URI of the collection. */ function _setBaseURI( string memory baseURI_ ) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function returning the total supply. */ function _totalSupply() internal view virtual returns ( uint256 ) { return supplyMinted(); } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString( uint256 value ) internal pure returns ( string memory ) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if ( value == 0 ) { return "0"; } uint256 temp = value; uint256 digits; while ( temp != 0 ) { digits ++; temp /= 10; } bytes memory buffer = new bytes( digits ); while ( value != 0 ) { digits -= 1; buffer[ digits ] = bytes1( uint8( 48 + uint256( value % 10 ) ) ); value /= 10; } return string( buffer ); } /** * @dev Transfers `tokenId_` from `from_` to `to_`. * * This internal function can be used to implement alternative mechanisms to perform * token transfer, such as signature-based, or token burning. * * Emits a {Transfer} event. */ function _transfer( address from_, address to_, uint256 tokenId_ ) internal virtual { getApproved[ tokenId_ ] = address( 0 ); uint256 _previousId_ = tokenId_ > 1 ? tokenId_ - 1 : 1; uint256 _nextId_ = tokenId_ + 1; bool _previousShouldUpdate_ = _previousId_ < tokenId_ && _exists( _previousId_ ) && _owners[ _previousId_ ] == address( 0 ); bool _nextShouldUpdate_ = _exists( _nextId_ ) && _owners[ _nextId_ ] == address( 0 ); if ( _previousShouldUpdate_ ) { _owners[ _previousId_ ] = from_; } if ( _nextShouldUpdate_ ) { _owners[ _nextId_ ] = from_; } _owners[ tokenId_ ] = to_; emit Transfer( from_, to_, tokenId_ ); } // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /** * @dev See {IERC721-approve}. */ function approve( address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == _tokenOwner_ ) { revert IERC721_INVALID_APPROVAL( to_ ); } getApproved[ tokenId_ ] = to_; emit Approval( _tokenOwner_, to_, tokenId_ ); } /** * @dev See {IERC721-safeTransferFrom}. * * Note: We can ignore `from_` as we can compare everything to the actual token owner, * but we cannot remove this parameter to stay in conformity with IERC721 */ function safeTransferFrom( address, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, "" ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } } /** * @dev See {IERC721-safeTransferFrom}. * * Note: We can ignore `from_` as we can compare everything to the actual token owner, * but we cannot remove this parameter to stay in conformity with IERC721 */ function safeTransferFrom( address, address to_, uint256 tokenId_, bytes calldata data_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); if ( ! _checkOnERC721Received( _tokenOwner_, to_, tokenId_, data_ ) ) { revert IERC721_NON_ERC721_RECEIVER( to_ ); } } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll( address operator_, bool approved_ ) public virtual override { address _account_ = _msgSender(); if ( operator_ == _account_ ) { revert IERC721_INVALID_APPROVAL( operator_ ); } _operatorApprovals[ _account_ ][ operator_ ] = approved_; emit ApprovalForAll( _account_, operator_, approved_ ); } /** * @dev See {IERC721-transferFrom}. * * Note: We can ignore `from_` as we can compare everything to the actual token owner, * but we cannot remove this parameter to stay in conformity with IERC721 */ function transferFrom( address, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) { address _operator_ = _msgSender(); address _tokenOwner_ = _ownerOf( tokenId_ ); bool _isApproved_ = _isApprovedOrOwner( _tokenOwner_, _operator_, tokenId_ ); if ( ! _isApproved_ ) { revert IERC721_CALLER_NOT_APPROVED( _tokenOwner_, _operator_, tokenId_ ); } if ( to_ == address( 0 ) ) { revert IERC721_INVALID_TRANSFER( to_ ); } _transfer( _tokenOwner_, to_, tokenId_ ); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /** * @dev Returns the number of tokens in `tokenOwner_`'s account. */ function balanceOf( address tokenOwner_ ) public view virtual returns ( uint256 ) { return _balanceOf( tokenOwner_ ); } /** * @dev Returns if the `operator_` is allowed to manage all of the assets of `tokenOwner_`. * * See {setApprovalForAll} */ function isApprovedForAll( address tokenOwner_, address operator_ ) public view virtual returns ( bool ) { return _isApprovedForAll( tokenOwner_, operator_ ); } /** * @dev Returns the owner of the `tokenId_` token. * * Requirements: * * - `tokenId_` must exist. */ function ownerOf( uint256 tokenId_ ) public view virtual exists( tokenId_ ) returns ( address ) { return _ownerOf( tokenId_ ); } /** * @dev Returns the total number of tokens minted * * @return uint256 the number of tokens that have been minted so far */ function supplyMinted() public view virtual returns ( uint256 ) { return _nextId - 1; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId_ ) public view virtual override returns ( bool ) { return interfaceId_ == type( IERC721Enumerable ).interfaceId || interfaceId_ == type( IERC721Metadata ).interfaceId || interfaceId_ == type( IERC721 ).interfaceId || interfaceId_ == type( IERC165 ).interfaceId; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex( uint256 index_ ) public view virtual override returns ( uint256 ) { if ( index_ >= supplyMinted() ) { revert IERC721Enumerable_INDEX_OUT_OF_BOUNDS( index_ ); } return index_; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex( address tokenOwner_, uint256 index_ ) public view virtual override returns ( uint256 tokenId ) { if ( index_ >= _balanceOf( tokenOwner_ ) ) { revert IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS( tokenOwner_, index_ ); } uint256 _count_ = 0; for ( uint256 i = 1; i < _nextId; i++ ) { if ( _exists( i ) && tokenOwner_ == _ownerOf( i ) ) { if ( index_ == _count_ ) { return i; } _count_++; } } } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI( uint256 tokenId_ ) public view virtual override exists( tokenId_ ) returns ( string memory ) { return bytes( _baseURI ).length > 0 ? string( abi.encodePacked( _baseURI, _toString( tokenId_ ) ) ) : _toString( tokenId_ ); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns ( uint256 ) { return _totalSupply(); } // ************************************** }
// SPDX-License-Identifier: MIT 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/IERC165.sol) pragma solidity 0.8.10; /** * @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 pragma solidity 0.8.10; interface IERC2981 { /** * @dev ERC165 bytes to add to interface array - set in parent contract * implementing this standard * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; * _registerInterface(_INTERFACE_ID_ERC2981); * * @notice Called with the sale price to determine how much royalty * is owed and to whom. * @param _tokenId - the NFT asset queried for royalty information * @param _salePrice - the sale price of the NFT asset specified by _tokenId * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for _salePrice */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity 0.8.10; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity 0.8.10; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity 0.8.10; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns ( uint256 ); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of `owner`'s tokens. */ function tokenOfOwnerByIndex( address owner_, uint256 index_ ) external view returns ( uint256 tokenId ); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex( uint256 index_ ) external view returns ( uint256 ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity 0.8.10; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId_` token is transferred from `from_` to `to_`. */ event Transfer( address indexed from_, address indexed to_, uint256 indexed tokenId_ ); /** * @dev Emitted when `owner_` enables `approved_` to manage the `tokenId_` token. */ event Approval( address indexed owner_, address indexed approved_, uint256 indexed tokenId_ ); /** * @dev Emitted when `owner_` enables or disables (`approved`) `operator_` to manage all of its assets. */ event ApprovalForAll( address indexed owner_ , address indexed operator_ , bool approved_ ); /** * @dev Gives permission to `to_` to transfer `tokenId_` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId_` must exist. * * Emits an {Approval} event. */ function approve( address to_, uint256 tokenId_ ) external; /** * @dev Safely transfers `tokenId_` token from `from_` to `to_`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from_` cannot be the zero address. * - `to_` cannot be the zero address. * - `tokenId_` token must exist and be owned by `from_`. * - If the caller is not `from_`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to_` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from_, address to_, uint256 tokenI_d ) external; /** * @dev Safely transfers `tokenId_` token from `from_` to `to_`. * * Requirements: * * - `from_` cannot be the zero address. * - `to_` cannot be the zero address. * - `tokenId_` token must exist and be owned by `from_`. * - If the caller is not `from_`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to_` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from_, address to_, uint256 tokenId_, bytes calldata data_ ) external; /** * @dev Approve or remove `operator_` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator_` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll( address operator_, bool approved_ ) external; /** * @dev Transfers `tokenId_` token from `from_` to `to_`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from_` cannot be the zero address. * - `to_` cannot be the zero address. * - `tokenId_` token must be owned by `from_`. * - If the caller is not `from_`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from_, address to_, uint256 tokenId_ ) external; /** * @dev Returns the number of tokens in `tokenOwner_`'s account. */ function balanceOf( address tokenOwner_ ) external view returns ( uint256 balance ); /** * @dev Returns the account approved for `tokenId_` token. * * Requirements: * * - `tokenId_` must exist. */ function getApproved( uint256 tokenId_ ) external view returns ( address operator ); /** * @dev Returns if the `operator_` is allowed to manage all of the assets of `tokenOwner_`. * * See {setApprovalForAll} */ function isApprovedForAll( address tokenOwner_, address operator_ ) external view returns ( bool ); /** * @dev Returns the owner of the `tokenId_` token. * * Requirements: * * - `tokenId_` must exist. */ function ownerOf( uint256 tokenId_ ) external view returns ( address owner ); }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"reserve_","type":"uint256"},{"internalType":"uint256","name":"maxBatch_","type":"uint256"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"royaltyRate","type":"uint256"},{"internalType":"uint256","name":"royaltyBase","type":"uint256"}],"name":"IERC2981_INVALID_ROYALTIES","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_CALLER_NOT_APPROVED","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IERC721_INVALID_APPROVAL","type":"error"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"IERC721_INVALID_TRANSFER","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_NONEXISTANT_TOKEN","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"IERC721_NON_ERC721_RECEIVER","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IOwnable_NOT_OWNER","type":"error"},{"inputs":[{"internalType":"uint8","name":"currentState","type":"uint8"}],"name":"IPausable_INCORRECT_STATE","type":"error"},{"inputs":[{"internalType":"uint8","name":"newState","type":"uint8"}],"name":"IPausable_INVALID_STATE","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"IWhitelistable_CONSUMED","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"IWhitelistable_FORBIDDEN","type":"error"},{"inputs":[],"name":"IWhitelistable_NOT_SET","type":"error"},{"inputs":[{"internalType":"uint256","name":"len1","type":"uint256"},{"internalType":"uint256","name":"len2","type":"uint256"}],"name":"NFT_ARRAY_LENGTH_MISMATCH","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NFT_ETHER_TRANSFER_FAIL","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountReceived","type":"uint256"},{"internalType":"uint256","name":"amountExpected","type":"uint256"}],"name":"NFT_INCORRECT_PRICE","type":"error"},{"inputs":[],"name":"NFT_INVALID_QTY","type":"error"},{"inputs":[],"name":"NFT_INVALID_SHARE","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NFT_INVALID_TEAM_MEMBER","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"maxBatch","type":"uint256"}],"name":"NFT_MAX_BATCH","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"reserveLeft","type":"uint256"}],"name":"NFT_MAX_RESERVE","type":"error"},{"inputs":[{"internalType":"uint256","name":"qtyRequested","type":"uint256"},{"internalType":"uint256","name":"remainingSupply","type":"uint256"}],"name":"NFT_MAX_SUPPLY","type":"error"},{"inputs":[{"internalType":"uint256","name":"missingShares","type":"uint256"}],"name":"NFT_MISSING_SHARES","type":"error"},{"inputs":[],"name":"NFT_NO_ETHER_BALANCE","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"approved_","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"operator_","type":"address"},{"indexed":false,"internalType":"bool","name":"approved_","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"previousState","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"newState","type":"uint8"}],"name":"ContractStateChanged","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":"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":"tokenId_","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLAIM","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_WHITELIST","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BATCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_SALE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyRegistryAddress_","type":"address"}],"name":"addProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint8","name":"whitelistType_","type":"uint8"},{"internalType":"uint256","name":"alloted_","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct IWhitelistable_ECDSA.Proof","name":"proof_","type":"tuple"}],"name":"checkWhitelistAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"alloted_","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct IWhitelistable_ECDSA.Proof","name":"proof_","type":"tuple"},{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPauseState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"alloted_","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct IWhitelistable_ECDSA.Proof","name":"proof_","type":"tuple"},{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"alloted_","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct IWhitelistable_ECDSA.Proof","name":"proof_","type":"tuple"},{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mintPrivateSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyRegistryAddress_","type":"address"}],"name":"removeProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","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":"","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":"","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":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newState_","type":"uint8"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"uint256","name":"royaltyRate_","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adminSigner_","type":"address"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyMinted","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":"index_","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016000553480156200001657600080fd5b5060405162003c3938038062003c39833981016040819052620000399162000250565b620000af838383666a94d74f4300006101f46040518060400160405280600e81526020016d213ab9b4102130b13c9021b63ab160911b81525060405180604001604052806004815260200163084aaa6960e31b8152506040518060600160405280602d815260200162003c0c602d9139620000b8565b505050620002bc565b620000c5838383620000fb565b600780546001600160a01b03191633179055620000e3338562000142565b505050600b92909255600c9290925550600d55600e55565b825162000110906001906020860190620001aa565b50815162000126906002906020850190620001aa565b5080516200013c906006906020840190620001aa565b50505050565b6200014e828262000152565b5050565b6127108111156200018557604051632761fe9d60e11b815260048101829052612710602482015260440160405180910390fd5b600955600a80546001600160a01b0319166001600160a01b0392909216919091179055565b828054620001b8906200027f565b90600052602060002090601f016020900481019282620001dc576000855562000227565b82601f10620001f757805160ff191683800117855562000227565b8280016001018555821562000227579182015b82811115620002275782518255916020019190600101906200020a565b506200023592915062000239565b5090565b5b808211156200023557600081556001016200023a565b6000806000606084860312156200026657600080fd5b8351925060208401519150604084015190509250925092565b600181811c908216806200029457607f821691505b60208210811415620002b657634e487b7160e01b600052602260045260246000fd5b50919050565b61394080620002cc6000396000f3fe6080604052600436106102c65760003560e01c806370a08231116101795780639a44f1fb116100d6578063e2e784d51161008a578063ef72f27611610064578063ef72f2761461078f578063efd0cbf9146107af578063f2fde38b146107c257600080fd5b8063e2e784d51461073a578063e5f79bee1461075a578063e985e9c51461076f57600080fd5b8063b4201461116100bb578063b4201461146106da578063b88d4fde146106fa578063c87b56dd1461071a57600080fd5b80639a44f1fb1461068a578063a22cb465146106ba57600080fd5b8063891552701161012d578063950bff9f11610112578063950bff9f1461064a57806395d89b411461066057806398c83a161461067557600080fd5b806389155270146106175780638da5cb5b1461062c57600080fd5b80637e9845f51161015e5780637e9845f5146105cc5780637f205a74146105e1578063854cff2f146105f757600080fd5b806370a082311461058557806373d74876146105a557600080fd5b8063379682a8116102275780635dd4300d116101db5780636352211e116101c05780636352211e1461052557806367243482146105455780636dfa99fd1461056557600080fd5b80635dd4300d146104f2578063630965091461050557600080fd5b806342842e0e1161020c57806342842e0e146104925780634f6ccce7146104b257806355f804b3146104d257600080fd5b8063379682a81461046a5780633ccfd60b1461047d57600080fd5b80631a3f839d1161027e5780632a55205a116102635780632a55205a146103f55780632f745c591461043457806332cb6b0c1461045457600080fd5b80631a3f839d146103b557806323b872dd146103d557600080fd5b8063081812fc116102af578063081812fc14610322578063095ea7b31461037057806318160ddd1461039257600080fd5b806301ffc9a7146102cb57806306fdde0314610300575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004612f70565b6107e2565b60405190151581526020015b60405180910390f35b34801561030c57600080fd5b50610315610802565b6040516102f79190613003565b34801561032e57600080fd5b5061035861033d366004613016565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b34801561037c57600080fd5b5061039061038b366004613044565b610890565b005b34801561039e57600080fd5b506103a7610a14565b6040519081526020016102f7565b3480156103c157600080fd5b506103a76103d0366004613167565b610a23565b3480156103e157600080fd5b506103906103f03660046131b7565b610b9a565b34801561040157600080fd5b506104156104103660046131f8565b610caa565b604080516001600160a01b0390931683526020830191909152016102f7565b34801561044057600080fd5b506103a761044f366004613044565b610d0a565b34801561046057600080fd5b506103a7600b5481565b61039061047836600461321a565b610dda565b34801561048957600080fd5b50610390610fe9565b34801561049e57600080fd5b506103906104ad3660046131b7565b611150565b3480156104be57600080fd5b506103a76104cd366004613016565b6112b3565b3480156104de57600080fd5b506103906104ed366004613250565b6112fc565b61039061050036600461321a565b61135a565b34801561051157600080fd5b50610390610520366004613303565b611541565b34801561053157600080fd5b50610358610540366004613016565b61159b565b34801561055157600080fd5b506103906105603660046133ad565b6115f2565b34801561057157600080fd5b5061039061058036600461346f565b611784565b34801561059157600080fd5b506103a76105a036600461346f565b6117de565b3480156105b157600080fd5b506105ba600481565b60405160ff90911681526020016102f7565b3480156105d857600080fd5b506103a76117e9565b3480156105ed57600080fd5b506103a7600d5481565b34801561060357600080fd5b5061039061061236600461346f565b6117fa565b34801561062357600080fd5b506105ba600181565b34801561063857600080fd5b506007546001600160a01b0316610358565b34801561065657600080fd5b506103a7600c5481565b34801561066c57600080fd5b50610315611882565b34801561068157600080fd5b506105ba600281565b34801561069657600080fd5b5060075474010000000000000000000000000000000000000000900460ff166105ba565b3480156106c657600080fd5b506103906106d536600461348c565b61188f565b3480156106e657600080fd5b506103906106f536600461321a565b611969565b34801561070657600080fd5b506103906107153660046134ca565b611b19565b34801561072657600080fd5b50610315610735366004613016565b611cae565b34801561074657600080fd5b50610390610755366004613044565b611d4a565b34801561076657600080fd5b506105ba600381565b34801561077b57600080fd5b506102eb61078a366004613569565b611daa565b34801561079b57600080fd5b506103906107aa36600461346f565b611dbd565b6103906107bd366004613016565b611e17565b3480156107ce57600080fd5b506103906107dd36600461346f565b611fde565b60006107ed8261209a565b806107fc57506107fc82612132565b92915050565b6001805461080f90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461083b90613597565b80156108885780601f1061085d57610100808354040283529160200191610888565b820191906000526020600020905b81548152906001019060200180831161086b57829003601f168201915b505050505081565b8061089a81612262565b6108d8576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b3360006108e484612279565b905060006108f38284876122d0565b905080610946576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b816001600160a01b0316866001600160a01b0316141561099d576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60008581526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6000610a1e612325565b905090565b6011546000906001600160a01b0316610a68576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff841660009081526012602090815260408083206001600160a01b03891684529091529020548311610ad2576040517f706e18b90000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016108cf565b6040805160ff861660208201529081018490526001600160a01b0386166060820152600090608001604051602081830303815290604052805190602001209050610b1c818461232f565b610b5d576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60ff851660009081526012602090815260408083206001600160a01b038a168452909152902054610b8e9085613614565b9150505b949350505050565b80610ba481612262565b610bdd576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b336000610be984612279565b90506000610bf88284876122d0565b905080610c4b576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b6001600160a01b038616610c96576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b610ca18287876123de565b50505050505050565b600080821580610cba5750600954155b15610cd4575050600a546001600160a01b03166000610d03565b600061271084600954610ce7919061362b565b610cf19190613697565b600a546001600160a01b031693509150505b9250929050565b6000610d15836125a7565b8210610d5f576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018390526044016108cf565b600060015b600054811015610dd257610d7781612262565b8015610d9c5750610d8781612279565b6001600160a01b0316856001600160a01b0316145b15610dc05781841415610db25791506107fc9050565b81610dbc816136ab565b9250505b80610dca816136ab565b915050610d64565b505092915050565b8080610e12576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff1660028114801590610e45575060ff8116600314155b15610e81576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108cf565b3360028686866000610e9586868686610a23565b905081811015610edc576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b6000610ee66117e9565b600e54600b54610ef69190613614565b610f009190613614565b9050808a1115610f46576040517f9abbab07000000000000000000000000000000000000000000000000000000008152600481018b9052602481018290526044016108cf565b6000600d548b610f56919061362b565b9050348114610f9a576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b3360008181527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b26020526040902080548d0190555b610fd9818d612656565b5050505050505050505050505050565b60075433906001600160a01b0316811461103a576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b4780611072576040517fc65d108600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040513390600090829084908381818185875af1925050503d80600081146110b6576040519150601f19603f3d011682016040523d82523d6000602084013e6110bb565b606091505b5050905080611108576040517f32bb0dee0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602481018490526044016108cf565b604080516001600160a01b0384168152602081018590527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a150505050565b8061115a81612262565b611193576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b33600061119f84612279565b905060006111ae8284876122d0565b905080611201576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b6001600160a01b03861661124c576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b6112578287876123de565b611272828787604051806020016040528060008152506127b7565b610ca1576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60006112bd6117e9565b82106112f8576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108cf565b5090565b60075433906001600160a01b0316811461134d576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b6113568261293b565b5050565b8080611392576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600381146113ef576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108cf565b336003868686600061140386868686610a23565b90508181101561144a576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60006114546117e9565b600e54600b546114649190613614565b61146e9190613614565b9050808a11156114b4576040517f9abbab07000000000000000000000000000000000000000000000000000000008152600481018b9052602481018290526044016108cf565b6000600d548b6114c4919061362b565b9050348114611508576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b3360008181527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a6020526040902080548d019055610fcf565b60075433906001600160a01b03168114611592576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b6113568261294e565b6000816115a781612262565b6115e0576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b6115e983612279565b91505b50919050565b60075433906001600160a01b03168114611643576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b8251825180821461168a576040517f23f901bf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108cf565b6000815b80156116d757856116a0600183613614565b815181106116b0576116b06136e4565b6020026020010151826116c39190613713565b9150806116cf8161372b565b91505061168e565b50600e5481111561172257600e546040517f016c69db0000000000000000000000000000000000000000000000000000000081526108cf918391600401918252602082015260400190565b600e8054829003905560005b83811015610ca15761177287828151811061174b5761174b6136e4565b6020026020010151878381518110611765576117656136e4565b6020026020010151612656565b8061177c816136ab565b91505061172e565b60075433906001600160a01b031681146117d5576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b611356826129cc565b60006107fc826125a7565b60006001600054610a1e9190613614565b60075433906001600160a01b0316811461184b576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b601180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790555050565b6002805461080f90613597565b336001600160a01b0383168114156118de576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016108cf565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b80806119a1576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16611a15576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff1660048201526024016108cf565b3360048585856000611a2986868686610a23565b905081811015611a70576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b600e543390891115611abc57600e546040517f016c69db0000000000000000000000000000000000000000000000000000000081526108cf918b91600401918252602082015260400190565b600e80548a900390556001600160a01b03811660009081527fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe0536020526040902080548a019055611b0c818a612656565b5050505050505050505050565b82611b2381612262565b611b5c576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b336000611b6886612279565b90506000611b778284896122d0565b905080611bca576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018890526064016108cf565b6001600160a01b038816611c15576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03891660048201526024016108cf565b611c208289896123de565b611c6282898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127b792505050565b611ca3576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03891660048201526024016108cf565b505050505050505050565b606081611cba81612262565b611cf3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b600060068054611d0290613597565b905011611d1757611d1283612b0e565b6115e9565b6006611d2284612b0e565b604051602001611d3392919061377c565b604051602081830303815290604052915050919050565b60075433906001600160a01b03168114611d9b576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b611da58383612c40565b505050565b6000611db68383612cc4565b9392505050565b60075433906001600160a01b03168114611e0e576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b61135682612d04565b8080611e4f576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600114611ec6576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff1660048201526024016108cf565b600c54821115611f1057600c546040517f5aaca4e40000000000000000000000000000000000000000000000000000000081526108cf918491600401918252602082015260400190565b6000611f1a6117e9565b600e54600b54611f2a9190613614565b611f349190613614565b905080831115611f7a576040517f9abbab0700000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016108cf565b6000600d5484611f8a919061362b565b9050348114611fce576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b611fd83385612656565b50505050565b60075433906001600160a01b0316811461202f576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b600780546001600160a01b038481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806107fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806121c557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061221157507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806107fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60008161227157506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b038116611db657816122ac8161372b565b6000818152600560205260409020549093506001600160a01b031691506122949050565b600080846001600160a01b0316846001600160a01b0316148061230c57506000838152600360205260409020546001600160a01b038581169116145b8061231c575061231c8585612cc4565b95945050505050565b6000610a1e6117e9565b6000806001848460400151856000015186602001516040516000815260200160405260405161237a949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561239c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001516011546001600160a01b0390811691161495945050505050565b600081815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556001821161242157600161242c565b61242c600183613614565b9050600061243b836001613713565b905060008383108015612452575061245283612262565b801561247357506000838152600560205260409020546001600160a01b0316155b9050600061248083612262565b80156124a157506000838152600560205260409020546001600160a01b0316155b905081156124e957600084815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b801561252f57600083815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b60008581526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b60006001600160a01b0382166125bf57506000919050565b60008060015b60005481101561264d576125d881612262565b1561263d576000818152600560205260409020546001600160a01b031615612615576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b0316141561263d5782612639816136ab565b9350505b612646816136ab565b90506125c5565b50909392505050565b60008054906126658383613713565b90506000612674600183613614565b600084815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0388161790559050828111156126fd57600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387161790555b8160008190555061272060008685604051806020016040528060008152506127b7565b612761576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016108cf565b846001600160a01b031660006001600160a01b0316847fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d846040516127a891815260200190565b60405180910390a45050505050565b6000833b8015612931576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a029061280c9033908a9089908990600401613851565b6020604051808303816000875af1925050508015612865575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526128629181019061388d565b60015b6128e4573d808015612893576040519150601f19603f3d011682016040523d82523d6000602084013e612898565b606091505b5080516128dc576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150610b929050565b6001915050610b92565b8051611356906006906020840190612eaf565b6007805460ff838116740100000000000000000000000000000000000000008181027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff85161790945560405193909204169182907f7285522ec93a20dcefa1a1d057094a227073a5463b91c0c19a23c6ef5c9c1fe490600090a35050565b600854808015611da557808060019003915050826001600160a01b0316600882815481106129fc576129fc6136e4565b6000918252602090912001546001600160a01b03161415611da55781612a23826001613713565b14612aa0576008612a35600184613614565b81548110612a4557612a456136e4565b600091825260209091200154600880546001600160a01b039092169183908110612a7157612a716136e4565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6008805480612ab157612ab16138aa565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505050565b606081612b4e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b785780612b62816136ab565b9150612b719050600a83613697565b9150612b52565b60008167ffffffffffffffff811115612b9357612b93613086565b6040519080825280601f01601f191660200182016040528015612bbd576020820181803683370190505b5090505b8415610b9257612bd2600183613614565b9150612bdf600a866138d9565b612bea906030613713565b60f81b818381518110612bff57612bff6136e4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c39600a86613697565b9450612bc1565b612710811115612c87576040517f4ec3fd3a0000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016108cf565b600955600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000612cd08383612dc3565b80611db657506001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16611db6565b6008545b8015612d5857808060019003915050816001600160a01b031660088281548110612d3457612d346136e4565b6000918252602090912001546001600160a01b03161415612d53575050565b612d08565b50600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546000905b8015612ea557808060019003915050600060088281548110612dee57612dee6136e4565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015612e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8591906138ed565b6001600160a01b03161415612e9f576001925050506107fc565b50612dca565b5060009392505050565b828054612ebb90613597565b90600052602060002090601f016020900481019282612edd5760008555612f23565b82601f10612ef657805160ff1916838001178555612f23565b82800160010185558215612f23579182015b82811115612f23578251825591602001919060010190612f08565b506112f89291505b808211156112f85760008155600101612f2b565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612f6d57600080fd5b50565b600060208284031215612f8257600080fd5b8135611db681612f3f565b60005b83811015612fa8578181015183820152602001612f90565b83811115611fd85750506000910152565b60008151808452612fd1816020860160208601612f8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db66020830184612fb9565b60006020828403121561302857600080fd5b5035919050565b6001600160a01b0381168114612f6d57600080fd5b6000806040838503121561305757600080fd5b82356130628161302f565b946020939093013593505050565b803560ff8116811461308157600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130fc576130fc613086565b604052919050565b60006060828403121561311657600080fd5b6040516060810181811067ffffffffffffffff8211171561313957613139613086565b8060405250809150823581526020830135602082015261315b60408401613070565b60408201525092915050565b60008060008060c0858703121561317d57600080fd5b84356131888161302f565b935061319660208601613070565b9250604085013591506131ac8660608701613104565b905092959194509250565b6000806000606084860312156131cc57600080fd5b83356131d78161302f565b925060208401356131e78161302f565b929592945050506040919091013590565b6000806040838503121561320b57600080fd5b50508035926020909101359150565b600080600060a0848603121561322f57600080fd5b833592506132408560208601613104565b9150608084013590509250925092565b6000602080838503121561326357600080fd5b823567ffffffffffffffff8082111561327b57600080fd5b818501915085601f83011261328f57600080fd5b8135818111156132a1576132a1613086565b6132d1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016130b5565b915080825286848285010111156132e757600080fd5b8084840185840137600090820190930192909252509392505050565b60006020828403121561331557600080fd5b611db682613070565b600067ffffffffffffffff82111561333857613338613086565b5060051b60200190565b600082601f83011261335357600080fd5b813560206133686133638361331e565b6130b5565b82815260059290921b8401810191818101908684111561338757600080fd5b8286015b848110156133a2578035835291830191830161338b565b509695505050505050565b600080604083850312156133c057600080fd5b823567ffffffffffffffff808211156133d857600080fd5b818501915085601f8301126133ec57600080fd5b813560206133fc6133638361331e565b82815260059290921b8401810191818101908984111561341b57600080fd5b948201945b838610156134425785356134338161302f565b82529482019490820190613420565b9650508601359250508082111561345857600080fd5b5061346585828601613342565b9150509250929050565b60006020828403121561348157600080fd5b8135611db68161302f565b6000806040838503121561349f57600080fd5b82356134aa8161302f565b9150602083013580151581146134bf57600080fd5b809150509250929050565b6000806000806000608086880312156134e257600080fd5b85356134ed8161302f565b945060208601356134fd8161302f565b935060408601359250606086013567ffffffffffffffff8082111561352157600080fd5b818801915088601f83011261353557600080fd5b81358181111561354457600080fd5b89602082850101111561355657600080fd5b9699959850939650602001949392505050565b6000806040838503121561357c57600080fd5b82356135878161302f565b915060208301356134bf8161302f565b600181811c908216806135ab57607f821691505b602082108114156115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613626576136266135e5565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613663576136636135e5565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826136a6576136a6613668565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136dd576136dd6135e5565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115613726576137266135e5565b500190565b60008161373a5761373a6135e5565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008151613772818560208601612f8d565b9290920192915050565b600080845481600182811c91508083168061379857607f831692505b60208084108214156137d1577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156137e5576001811461381457613841565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613841565b60008b81526020902060005b868110156138395781548b820152908501908301613820565b505084890196505b50505050505061231c8185613760565b60006001600160a01b038087168352808616602084015250836040830152608060608301526138836080830184612fb9565b9695505050505050565b60006020828403121561389f57600080fd5b8151611db681612f3f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826138e8576138e8613668565b500690565b6000602082840312156138ff57600080fd5b8151611db68161302f56fea2646970667358221220c23bf519f017375ddfe0a0ade5e60fa341b2f52dbd7d3a87bf3e31c8f044bc9764736f6c634300080a003368747470733a2f2f6170692e6275736862616279636c75622e696f2f6d657461646174613f746f6b656e49643d000000000000000000000000000000000000000000000000000000000000082a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001e61
Deployed Bytecode
0x6080604052600436106102c65760003560e01c806370a08231116101795780639a44f1fb116100d6578063e2e784d51161008a578063ef72f27611610064578063ef72f2761461078f578063efd0cbf9146107af578063f2fde38b146107c257600080fd5b8063e2e784d51461073a578063e5f79bee1461075a578063e985e9c51461076f57600080fd5b8063b4201461116100bb578063b4201461146106da578063b88d4fde146106fa578063c87b56dd1461071a57600080fd5b80639a44f1fb1461068a578063a22cb465146106ba57600080fd5b8063891552701161012d578063950bff9f11610112578063950bff9f1461064a57806395d89b411461066057806398c83a161461067557600080fd5b806389155270146106175780638da5cb5b1461062c57600080fd5b80637e9845f51161015e5780637e9845f5146105cc5780637f205a74146105e1578063854cff2f146105f757600080fd5b806370a082311461058557806373d74876146105a557600080fd5b8063379682a8116102275780635dd4300d116101db5780636352211e116101c05780636352211e1461052557806367243482146105455780636dfa99fd1461056557600080fd5b80635dd4300d146104f2578063630965091461050557600080fd5b806342842e0e1161020c57806342842e0e146104925780634f6ccce7146104b257806355f804b3146104d257600080fd5b8063379682a81461046a5780633ccfd60b1461047d57600080fd5b80631a3f839d1161027e5780632a55205a116102635780632a55205a146103f55780632f745c591461043457806332cb6b0c1461045457600080fd5b80631a3f839d146103b557806323b872dd146103d557600080fd5b8063081812fc116102af578063081812fc14610322578063095ea7b31461037057806318160ddd1461039257600080fd5b806301ffc9a7146102cb57806306fdde0314610300575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004612f70565b6107e2565b60405190151581526020015b60405180910390f35b34801561030c57600080fd5b50610315610802565b6040516102f79190613003565b34801561032e57600080fd5b5061035861033d366004613016565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b34801561037c57600080fd5b5061039061038b366004613044565b610890565b005b34801561039e57600080fd5b506103a7610a14565b6040519081526020016102f7565b3480156103c157600080fd5b506103a76103d0366004613167565b610a23565b3480156103e157600080fd5b506103906103f03660046131b7565b610b9a565b34801561040157600080fd5b506104156104103660046131f8565b610caa565b604080516001600160a01b0390931683526020830191909152016102f7565b34801561044057600080fd5b506103a761044f366004613044565b610d0a565b34801561046057600080fd5b506103a7600b5481565b61039061047836600461321a565b610dda565b34801561048957600080fd5b50610390610fe9565b34801561049e57600080fd5b506103906104ad3660046131b7565b611150565b3480156104be57600080fd5b506103a76104cd366004613016565b6112b3565b3480156104de57600080fd5b506103906104ed366004613250565b6112fc565b61039061050036600461321a565b61135a565b34801561051157600080fd5b50610390610520366004613303565b611541565b34801561053157600080fd5b50610358610540366004613016565b61159b565b34801561055157600080fd5b506103906105603660046133ad565b6115f2565b34801561057157600080fd5b5061039061058036600461346f565b611784565b34801561059157600080fd5b506103a76105a036600461346f565b6117de565b3480156105b157600080fd5b506105ba600481565b60405160ff90911681526020016102f7565b3480156105d857600080fd5b506103a76117e9565b3480156105ed57600080fd5b506103a7600d5481565b34801561060357600080fd5b5061039061061236600461346f565b6117fa565b34801561062357600080fd5b506105ba600181565b34801561063857600080fd5b506007546001600160a01b0316610358565b34801561065657600080fd5b506103a7600c5481565b34801561066c57600080fd5b50610315611882565b34801561068157600080fd5b506105ba600281565b34801561069657600080fd5b5060075474010000000000000000000000000000000000000000900460ff166105ba565b3480156106c657600080fd5b506103906106d536600461348c565b61188f565b3480156106e657600080fd5b506103906106f536600461321a565b611969565b34801561070657600080fd5b506103906107153660046134ca565b611b19565b34801561072657600080fd5b50610315610735366004613016565b611cae565b34801561074657600080fd5b50610390610755366004613044565b611d4a565b34801561076657600080fd5b506105ba600381565b34801561077b57600080fd5b506102eb61078a366004613569565b611daa565b34801561079b57600080fd5b506103906107aa36600461346f565b611dbd565b6103906107bd366004613016565b611e17565b3480156107ce57600080fd5b506103906107dd36600461346f565b611fde565b60006107ed8261209a565b806107fc57506107fc82612132565b92915050565b6001805461080f90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461083b90613597565b80156108885780601f1061085d57610100808354040283529160200191610888565b820191906000526020600020905b81548152906001019060200180831161086b57829003601f168201915b505050505081565b8061089a81612262565b6108d8576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b3360006108e484612279565b905060006108f38284876122d0565b905080610946576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b816001600160a01b0316866001600160a01b0316141561099d576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60008581526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b6000610a1e612325565b905090565b6011546000906001600160a01b0316610a68576040517fc71bad4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff841660009081526012602090815260408083206001600160a01b03891684529091529020548311610ad2576040517f706e18b90000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016108cf565b6040805160ff861660208201529081018490526001600160a01b0386166060820152600090608001604051602081830303815290604052805190602001209050610b1c818461232f565b610b5d576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60ff851660009081526012602090815260408083206001600160a01b038a168452909152902054610b8e9085613614565b9150505b949350505050565b80610ba481612262565b610bdd576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b336000610be984612279565b90506000610bf88284876122d0565b905080610c4b576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b6001600160a01b038616610c96576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b610ca18287876123de565b50505050505050565b600080821580610cba5750600954155b15610cd4575050600a546001600160a01b03166000610d03565b600061271084600954610ce7919061362b565b610cf19190613697565b600a546001600160a01b031693509150505b9250929050565b6000610d15836125a7565b8210610d5f576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018390526044016108cf565b600060015b600054811015610dd257610d7781612262565b8015610d9c5750610d8781612279565b6001600160a01b0316856001600160a01b0316145b15610dc05781841415610db25791506107fc9050565b81610dbc816136ab565b9250505b80610dca816136ab565b915050610d64565b505092915050565b8080610e12576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff1660028114801590610e45575060ff8116600314155b15610e81576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108cf565b3360028686866000610e9586868686610a23565b905081811015610edc576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b6000610ee66117e9565b600e54600b54610ef69190613614565b610f009190613614565b9050808a1115610f46576040517f9abbab07000000000000000000000000000000000000000000000000000000008152600481018b9052602481018290526044016108cf565b6000600d548b610f56919061362b565b9050348114610f9a576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b3360008181527f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b26020526040902080548d0190555b610fd9818d612656565b5050505050505050505050505050565b60075433906001600160a01b0316811461103a576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b4780611072576040517fc65d108600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040513390600090829084908381818185875af1925050503d80600081146110b6576040519150601f19603f3d011682016040523d82523d6000602084013e6110bb565b606091505b5050905080611108576040517f32bb0dee0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602481018490526044016108cf565b604080516001600160a01b0384168152602081018590527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a150505050565b8061115a81612262565b611193576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b33600061119f84612279565b905060006111ae8284876122d0565b905080611201576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018690526064016108cf565b6001600160a01b03861661124c576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b6112578287876123de565b611272828787604051806020016040528060008152506127b7565b610ca1576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60006112bd6117e9565b82106112f8576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108cf565b5090565b60075433906001600160a01b0316811461134d576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b6113568261293b565b5050565b8080611392576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600381146113ef576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff821660048201526024016108cf565b336003868686600061140386868686610a23565b90508181101561144a576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b60006114546117e9565b600e54600b546114649190613614565b61146e9190613614565b9050808a11156114b4576040517f9abbab07000000000000000000000000000000000000000000000000000000008152600481018b9052602481018290526044016108cf565b6000600d548b6114c4919061362b565b9050348114611508576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b3360008181527f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a6020526040902080548d019055610fcf565b60075433906001600160a01b03168114611592576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b6113568261294e565b6000816115a781612262565b6115e0576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b6115e983612279565b91505b50919050565b60075433906001600160a01b03168114611643576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b8251825180821461168a576040517f23f901bf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108cf565b6000815b80156116d757856116a0600183613614565b815181106116b0576116b06136e4565b6020026020010151826116c39190613713565b9150806116cf8161372b565b91505061168e565b50600e5481111561172257600e546040517f016c69db0000000000000000000000000000000000000000000000000000000081526108cf918391600401918252602082015260400190565b600e8054829003905560005b83811015610ca15761177287828151811061174b5761174b6136e4565b6020026020010151878381518110611765576117656136e4565b6020026020010151612656565b8061177c816136ab565b91505061172e565b60075433906001600160a01b031681146117d5576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b611356826129cc565b60006107fc826125a7565b60006001600054610a1e9190613614565b60075433906001600160a01b0316811461184b576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b601180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790555050565b6002805461080f90613597565b336001600160a01b0383168114156118de576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016108cf565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b80806119a1576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16611a15576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff1660048201526024016108cf565b3360048585856000611a2986868686610a23565b905081811015611a70576040517ff9790dfd0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b600e543390891115611abc57600e546040517f016c69db0000000000000000000000000000000000000000000000000000000081526108cf918b91600401918252602082015260400190565b600e80548a900390556001600160a01b03811660009081527fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe0536020526040902080548a019055611b0c818a612656565b5050505050505050505050565b82611b2381612262565b611b5c576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b336000611b6886612279565b90506000611b778284896122d0565b905080611bca576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015284166024820152604481018890526064016108cf565b6001600160a01b038816611c15576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b03891660048201526024016108cf565b611c208289896123de565b611c6282898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127b792505050565b611ca3576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03891660048201526024016108cf565b505050505050505050565b606081611cba81612262565b611cf3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016108cf565b600060068054611d0290613597565b905011611d1757611d1283612b0e565b6115e9565b6006611d2284612b0e565b604051602001611d3392919061377c565b604051602081830303815290604052915050919050565b60075433906001600160a01b03168114611d9b576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b611da58383612c40565b505050565b6000611db68383612cc4565b9392505050565b60075433906001600160a01b03168114611e0e576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b61135682612d04565b8080611e4f576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600114611ec6576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff1660048201526024016108cf565b600c54821115611f1057600c546040517f5aaca4e40000000000000000000000000000000000000000000000000000000081526108cf918491600401918252602082015260400190565b6000611f1a6117e9565b600e54600b54611f2a9190613614565b611f349190613614565b905080831115611f7a576040517f9abbab0700000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016108cf565b6000600d5484611f8a919061362b565b9050348114611fce576040517f87f85d7a000000000000000000000000000000000000000000000000000000008152346004820152602481018290526044016108cf565b611fd83385612656565b50505050565b60075433906001600160a01b0316811461202f576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108cf565b600780546001600160a01b038481167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806107fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806121c557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061221157507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b806107fc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60008161227157506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b038116611db657816122ac8161372b565b6000818152600560205260409020549093506001600160a01b031691506122949050565b600080846001600160a01b0316846001600160a01b0316148061230c57506000838152600360205260409020546001600160a01b038581169116145b8061231c575061231c8585612cc4565b95945050505050565b6000610a1e6117e9565b6000806001848460400151856000015186602001516040516000815260200160405260405161237a949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561239c573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001516011546001600160a01b0390811691161495945050505050565b600081815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556001821161242157600161242c565b61242c600183613614565b9050600061243b836001613713565b905060008383108015612452575061245283612262565b801561247357506000838152600560205260409020546001600160a01b0316155b9050600061248083612262565b80156124a157506000838152600560205260409020546001600160a01b0316155b905081156124e957600084815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b801561252f57600083815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389161790555b60008581526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b60006001600160a01b0382166125bf57506000919050565b60008060015b60005481101561264d576125d881612262565b1561263d576000818152600560205260409020546001600160a01b031615612615576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b0316141561263d5782612639816136ab565b9350505b612646816136ab565b90506125c5565b50909392505050565b60008054906126658383613713565b90506000612674600183613614565b600084815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0388161790559050828111156126fd57600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387161790555b8160008190555061272060008685604051806020016040528060008152506127b7565b612761576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016108cf565b846001600160a01b031660006001600160a01b0316847fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d846040516127a891815260200190565b60405180910390a45050505050565b6000833b8015612931576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a029061280c9033908a9089908990600401613851565b6020604051808303816000875af1925050508015612865575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526128629181019061388d565b60015b6128e4573d808015612893576040519150601f19603f3d011682016040523d82523d6000602084013e612898565b606091505b5080516128dc576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b03871660048201526024016108cf565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150610b929050565b6001915050610b92565b8051611356906006906020840190612eaf565b6007805460ff838116740100000000000000000000000000000000000000008181027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff85161790945560405193909204169182907f7285522ec93a20dcefa1a1d057094a227073a5463b91c0c19a23c6ef5c9c1fe490600090a35050565b600854808015611da557808060019003915050826001600160a01b0316600882815481106129fc576129fc6136e4565b6000918252602090912001546001600160a01b03161415611da55781612a23826001613713565b14612aa0576008612a35600184613614565b81548110612a4557612a456136e4565b600091825260209091200154600880546001600160a01b039092169183908110612a7157612a716136e4565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6008805480612ab157612ab16138aa565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505050565b606081612b4e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612b785780612b62816136ab565b9150612b719050600a83613697565b9150612b52565b60008167ffffffffffffffff811115612b9357612b93613086565b6040519080825280601f01601f191660200182016040528015612bbd576020820181803683370190505b5090505b8415610b9257612bd2600183613614565b9150612bdf600a866138d9565b612bea906030613713565b60f81b818381518110612bff57612bff6136e4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612c39600a86613697565b9450612bc1565b612710811115612c87576040517f4ec3fd3a0000000000000000000000000000000000000000000000000000000081526004810182905261271060248201526044016108cf565b600955600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000612cd08383612dc3565b80611db657506001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16611db6565b6008545b8015612d5857808060019003915050816001600160a01b031660088281548110612d3457612d346136e4565b6000918252602090912001546001600160a01b03161415612d53575050565b612d08565b50600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546000905b8015612ea557808060019003915050600060088281548110612dee57612dee6136e4565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015612e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8591906138ed565b6001600160a01b03161415612e9f576001925050506107fc565b50612dca565b5060009392505050565b828054612ebb90613597565b90600052602060002090601f016020900481019282612edd5760008555612f23565b82601f10612ef657805160ff1916838001178555612f23565b82800160010185558215612f23579182015b82811115612f23578251825591602001919060010190612f08565b506112f89291505b808211156112f85760008155600101612f2b565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612f6d57600080fd5b50565b600060208284031215612f8257600080fd5b8135611db681612f3f565b60005b83811015612fa8578181015183820152602001612f90565b83811115611fd85750506000910152565b60008151808452612fd1816020860160208601612f8d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611db66020830184612fb9565b60006020828403121561302857600080fd5b5035919050565b6001600160a01b0381168114612f6d57600080fd5b6000806040838503121561305757600080fd5b82356130628161302f565b946020939093013593505050565b803560ff8116811461308157600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156130fc576130fc613086565b604052919050565b60006060828403121561311657600080fd5b6040516060810181811067ffffffffffffffff8211171561313957613139613086565b8060405250809150823581526020830135602082015261315b60408401613070565b60408201525092915050565b60008060008060c0858703121561317d57600080fd5b84356131888161302f565b935061319660208601613070565b9250604085013591506131ac8660608701613104565b905092959194509250565b6000806000606084860312156131cc57600080fd5b83356131d78161302f565b925060208401356131e78161302f565b929592945050506040919091013590565b6000806040838503121561320b57600080fd5b50508035926020909101359150565b600080600060a0848603121561322f57600080fd5b833592506132408560208601613104565b9150608084013590509250925092565b6000602080838503121561326357600080fd5b823567ffffffffffffffff8082111561327b57600080fd5b818501915085601f83011261328f57600080fd5b8135818111156132a1576132a1613086565b6132d1847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016130b5565b915080825286848285010111156132e757600080fd5b8084840185840137600090820190930192909252509392505050565b60006020828403121561331557600080fd5b611db682613070565b600067ffffffffffffffff82111561333857613338613086565b5060051b60200190565b600082601f83011261335357600080fd5b813560206133686133638361331e565b6130b5565b82815260059290921b8401810191818101908684111561338757600080fd5b8286015b848110156133a2578035835291830191830161338b565b509695505050505050565b600080604083850312156133c057600080fd5b823567ffffffffffffffff808211156133d857600080fd5b818501915085601f8301126133ec57600080fd5b813560206133fc6133638361331e565b82815260059290921b8401810191818101908984111561341b57600080fd5b948201945b838610156134425785356134338161302f565b82529482019490820190613420565b9650508601359250508082111561345857600080fd5b5061346585828601613342565b9150509250929050565b60006020828403121561348157600080fd5b8135611db68161302f565b6000806040838503121561349f57600080fd5b82356134aa8161302f565b9150602083013580151581146134bf57600080fd5b809150509250929050565b6000806000806000608086880312156134e257600080fd5b85356134ed8161302f565b945060208601356134fd8161302f565b935060408601359250606086013567ffffffffffffffff8082111561352157600080fd5b818801915088601f83011261353557600080fd5b81358181111561354457600080fd5b89602082850101111561355657600080fd5b9699959850939650602001949392505050565b6000806040838503121561357c57600080fd5b82356135878161302f565b915060208301356134bf8161302f565b600181811c908216806135ab57607f821691505b602082108114156115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613626576136266135e5565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613663576136636135e5565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826136a6576136a6613668565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136dd576136dd6135e5565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115613726576137266135e5565b500190565b60008161373a5761373a6135e5565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008151613772818560208601612f8d565b9290920192915050565b600080845481600182811c91508083168061379857607f831692505b60208084108214156137d1577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156137e5576001811461381457613841565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613841565b60008b81526020902060005b868110156138395781548b820152908501908301613820565b505084890196505b50505050505061231c8185613760565b60006001600160a01b038087168352808616602084015250836040830152608060608301526138836080830184612fb9565b9695505050505050565b60006020828403121561389f57600080fd5b8151611db681612f3f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826138e8576138e8613668565b500690565b6000602082840312156138ff57600080fd5b8151611db68161302f56fea2646970667358221220c23bf519f017375ddfe0a0ade5e60fa341b2f52dbd7d3a87bf3e31c8f044bc9764736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000082a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000001e61
-----Decoded View---------------
Arg [0] : reserve_ (uint256): 2090
Arg [1] : maxBatch_ (uint256): 10
Arg [2] : maxSupply_ (uint256): 7777
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000082a
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001e61
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.