Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,507 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 24006651 | 54 days ago | IN | 0 ETH | 0.00000099 | ||||
| Set Approval For... | 23006447 | 194 days ago | IN | 0 ETH | 0.00010213 | ||||
| Set Approval For... | 22487740 | 266 days ago | IN | 0 ETH | 0.00017067 | ||||
| Set Approval For... | 22038586 | 329 days ago | IN | 0 ETH | 0.00004394 | ||||
| Set Approval For... | 21903988 | 348 days ago | IN | 0 ETH | 0.0000829 | ||||
| Set Approval For... | 21576835 | 393 days ago | IN | 0 ETH | 0.00035555 | ||||
| Set Approval For... | 18959382 | 759 days ago | IN | 0 ETH | 0.00076195 | ||||
| Set Approval For... | 18269677 | 856 days ago | IN | 0 ETH | 0.0003397 | ||||
| Set Approval For... | 18255761 | 858 days ago | IN | 0 ETH | 0.00015194 | ||||
| Transfer From | 17446833 | 971 days ago | IN | 0 ETH | 0.0006749 | ||||
| Set Approval For... | 17025180 | 1031 days ago | IN | 0 ETH | 0.00054091 | ||||
| Safe Transfer Fr... | 17000809 | 1034 days ago | IN | 0 ETH | 0.00086186 | ||||
| Set Approval For... | 16899786 | 1049 days ago | IN | 0 ETH | 0.0010391 | ||||
| Safe Transfer Fr... | 16827603 | 1059 days ago | IN | 0 ETH | 0.00163163 | ||||
| Safe Transfer Fr... | 16827599 | 1059 days ago | IN | 0 ETH | 0.00165578 | ||||
| Safe Transfer Fr... | 16785297 | 1065 days ago | IN | 0 ETH | 0.00188553 | ||||
| Safe Transfer Fr... | 16772102 | 1067 days ago | IN | 0 ETH | 0.00175141 | ||||
| Set Approval For... | 16740177 | 1071 days ago | IN | 0 ETH | 0.00052097 | ||||
| Safe Transfer Fr... | 16738279 | 1071 days ago | IN | 0 ETH | 0.00232813 | ||||
| Set Approval For... | 16612146 | 1089 days ago | IN | 0 ETH | 0.00069416 | ||||
| Safe Transfer Fr... | 16601510 | 1091 days ago | IN | 0 ETH | 0.0019523 | ||||
| Safe Transfer Fr... | 16574597 | 1094 days ago | IN | 0 ETH | 0.00123358 | ||||
| Set Approval For... | 16574561 | 1094 days ago | IN | 0 ETH | 0.00079594 | ||||
| Safe Transfer Fr... | 16545902 | 1098 days ago | IN | 0 ETH | 0.00121605 | ||||
| Set Approval For... | 16508226 | 1104 days ago | IN | 0 ETH | 0.0007385 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Degen
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/NFTFree.sol';
import '../EthereumContracts/contracts/interfaces/IERC721.sol';
abstract contract CCVault {
function balanceOf( address tokenOwner ) public virtual view returns ( uint256 key ) {}
}
contract Degen is NFTFree {
error NFT_FORBIDDEN( address account );
error NFT_ALLOCATION_CONSUMED( address account );
error NFT_MAX_ALLOCATION( address account, uint256 allocated );
uint8 public constant PRIVATE_SALE = 2;
uint8 public constant PARTNER_SALE = 3;
uint256 public constant MINTS_PER_KEY = 3;
uint256 public constant MINTS_PER_PARTNER = 1;
mapping( address => uint256 ) public privateMints;
mapping( address => uint256 ) public partnerMints;
CCVault private _vault;
IERC721 private _tab;
IERC721 private _fmc;
constructor () {
_initNFTFree (
300,
5,
4000,
1250,
"GMers",
"GMER",
"https://collectorsclub.io/api/gmers/metadata?tokenId="
);
}
/**
* Ensures the contract state is PRIVATE_SALE or PARTNER_SALE
*/
modifier isPrivateOrPartnerSale {
uint8 _currentState_ = getPauseState();
if ( _currentState_ != PRIVATE_SALE && _currentState_ != PARTNER_SALE ) {
revert IPausable_INCORRECT_STATE( _currentState_ );
}
_;
}
/**
* Ensures the contract state is PARTNER_SALE
*/
modifier isPartnerSale {
uint8 _currentState_ = getPauseState();
if ( _currentState_ != PARTNER_SALE ) {
revert IPausable_INCORRECT_STATE( _currentState_ );
}
_;
}
// **************************************
// ***** INTERNAL *****
// **************************************
/**
* @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(NFTFree) returns ( bool ) {
return operator_ == address( _vault ) ||
super._isApprovedForAll( tokenOwner_, operator_ );
}
// **************************************
// **************************************
// ***** PUBLIC *****
// **************************************
/**
* Mints a single token during the PARTNER_SALE period.
*
* Requirements:
* - Contract state must be PARTNER_SALE
* - Caller must own one of the PARTNER NFTs
* - Caller must not have minted through this function before
*/
function mintPartner() public isPartnerSale {
address _account_ = _msgSender();
if ( partnerMints[ _account_ ] == MINTS_PER_PARTNER ) {
revert NFT_ALLOCATION_CONSUMED( _account_ );
}
uint256 _remainingSupply_ = MAX_SUPPLY - _reserve - supplyMinted();
if ( _remainingSupply_ < MINTS_PER_PARTNER ) {
revert NFT_MAX_SUPPLY( MINTS_PER_PARTNER, _remainingSupply_ );
}
uint256 _allocated_;
uint256 _tabOwned_ = _tab.balanceOf( _account_ );
if ( _tabOwned_ > 0 ) {
_allocated_ = MINTS_PER_PARTNER;
}
else {
uint256 _fmcOwned_ = _fmc.balanceOf( _account_ );
if ( _fmcOwned_ > 0 ) {
_allocated_ = MINTS_PER_PARTNER;
}
}
if ( _allocated_ < MINTS_PER_PARTNER ) {
revert NFT_FORBIDDEN( _account_ );
}
unchecked {
partnerMints[ _account_ ] = MINTS_PER_PARTNER;
}
_mint( _account_, MINTS_PER_PARTNER );
}
/**
* Mints tokens for key stakers.
*
* @param qty_ ~ type = uint256 : the number of tokens to mint
*
* Requirements:
* - `qty_` must be greater than 0
* - Contract state must be PARTNER_SALE or PRIVATE_SALE
* - Caller must have enough keys staked (one key staked = 3 tokens)
* - Caller must have enough remaining tokens allocated to mint `qty_` tokens
*/
function mintPrivate( uint256 qty_ ) public validateAmount( qty_ ) isPrivateOrPartnerSale {
address _account_ = _msgSender();
if ( privateMints[ _account_ ] == MINTS_PER_KEY ) {
revert NFT_ALLOCATION_CONSUMED( _account_ );
}
uint256 _remainingSupply_ = MAX_SUPPLY - _reserve - supplyMinted();
if ( _remainingSupply_ < qty_ ) {
revert NFT_MAX_SUPPLY( qty_, _remainingSupply_ );
}
uint256 _keys_ = _vault.balanceOf( _account_ );
uint256 _allocated_ = _keys_ * MINTS_PER_KEY;
uint256 _claimed_ = privateMints[ _account_ ];
if ( qty_ > _allocated_ - _claimed_ ) {
revert NFT_MAX_ALLOCATION( _account_, _allocated_ );
}
unchecked {
privateMints[ _account_ ] = _claimed_ + qty_;
}
_mint( _account_, qty_ );
}
// **************************************
// **************************************
// ***** CONTRACT OWNER *****
// **************************************
/**
* @dev Sets the vault contract address.
*/
function setVault( address vault_ ) public onlyOwner {
_vault = CCVault( vault_ );
}
/**
* @dev Sets the FMC contract address.
*/
function setFmc( address fmc_ ) public onlyOwner {
_fmc = IERC721( fmc_ );
}
/**
* @dev Sets the TAB contract address.
*/
function setTab( address tab_ ) public onlyOwner {
_tab = IERC721( tab_ );
}
// **************************************
}// 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 );
}// SPDX-License-Identifier: MIT
/**
* Author: Lambdalf the White
*/
pragma solidity 0.8.10;
import '../tokens/ERC721/Reg_ERC721Batch.sol';
import '../utils/IOwnable.sol';
import '../utils/IPausable.sol';
import '../utils/ITradable.sol';
import '../utils/ERC2981Base.sol';
abstract contract NFTFree is Reg_ERC721Batch, IOwnable, IPausable, ITradable, ERC2981Base {
// Errors
error NFT_ARRAY_LENGTH_MISMATCH( uint256 len1, uint256 len2 );
error NFT_INVALID_QTY();
error NFT_MAX_BATCH( uint256 qtyRequested, uint256 maxBatch );
error NFT_MAX_RESERVE( uint256 qtyRequested, uint256 reserveLeft );
error NFT_MAX_SUPPLY( uint256 qtyRequested, uint256 remainingSupply );
uint256 private constant SHARE_BASE = 10000;
uint256 public MAX_SUPPLY;
uint256 public MAX_BATCH;
uint256 internal _reserve;
/**
* @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 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
*/
function _initNFTFree (
uint256 reserve_,
uint256 maxBatch_,
uint256 maxSupply_,
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_;
_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(Reg_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 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_ );
}
_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_ );
}
// **************************************
// **************************************
// ***** VIEW *****
// **************************************
function supportsInterface( bytes4 interfaceId_ ) public view virtual override(Reg_ERC721Batch, ERC2981Base) returns ( bool ) {
return ERC2981Base.supportsInterface( interfaceId_ ) ||
Reg_ERC721Batch.supportsInterface( interfaceId_ );
}
// **************************************
}// 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
/**
* 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 Reg_ERC721Batch is Context, IERC721Metadata, IERC721Enumerable {
// 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 IERC721_INVALID_TRANSFER_FROM();
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_ );
}
for ( uint256 i = _firstToken_; i < _nextStart_; ++i ) {
emit Transfer( address( 0 ), to_, i );
}
}
/**
* @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 from_, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) {
address _operator_ = _msgSender();
address _tokenOwner_ = _ownerOf( tokenId_ );
if ( from_ != _tokenOwner_ ) {
revert IERC721_INVALID_TRANSFER_FROM();
}
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 from_, address to_, uint256 tokenId_, bytes calldata data_ ) public virtual exists( tokenId_ ) {
address _operator_ = _msgSender();
address _tokenOwner_ = _ownerOf( tokenId_ );
if ( from_ != _tokenOwner_ ) {
revert IERC721_INVALID_TRANSFER_FROM();
}
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 from_, address to_, uint256 tokenId_ ) public virtual exists( tokenId_ ) {
address _operator_ = _msgSender();
address _tokenOwner_ = _ownerOf( tokenId_ );
if ( from_ != _tokenOwner_ ) {
revert IERC721_INVALID_TRANSFER_FROM();
}
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
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 );
}{
"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
Contract ABI
API[{"inputs":[],"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":[],"name":"IERC721_INVALID_TRANSFER_FROM","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":"NFT_ALLOCATION_CONSUMED","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":"account","type":"address"}],"name":"NFT_FORBIDDEN","type":"error"},{"inputs":[],"name":"NFT_INVALID_QTY","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"allocated","type":"uint256"}],"name":"NFT_MAX_ALLOCATION","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"},{"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":"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":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":"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":"MINTS_PER_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTS_PER_PARTNER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTNER_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":[{"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":"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":[],"name":"mintPartner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mintPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty_","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"partnerMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privateMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fmc_","type":"address"}],"name":"setFmc","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":"tab_","type":"address"}],"name":"setTab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault_","type":"address"}],"name":"setVault","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":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260016000553480156200001657600080fd5b506200008161012c6005610fa06104e260405180604001604052806005815260200164474d65727360d81b8152506040518060400160405280600481526020016323a6a2a960e11b815250604051806060016040528060358152602001620036766035913962000087565b62000256565b62000094838383620000c4565b600780546001600160a01b03191633179055620000b233856200010b565b505050600b9190915550600c55600d55565b8251620000d990600190602086019062000173565b508151620000ef90600290602085019062000173565b5080516200010590600690602084019062000173565b50505050565b6200011782826200011b565b5050565b6127108111156200014e57604051632761fe9d60e11b815260048101829052612710602482015260440160405180910390fd5b600955600a80546001600160a01b0319166001600160a01b0392909216919091179055565b828054620001819062000219565b90600052602060002090601f016020900481019282620001a55760008555620001f0565b82601f10620001c057805160ff1916838001178555620001f0565b82800160010185558215620001f0579182015b82811115620001f0578251825591602001919060010190620001d3565b50620001fe92915062000202565b5090565b5b80821115620001fe576000815560010162000203565b600181811c908216806200022e57607f821691505b602082108114156200025057634e487b7160e01b600052602260045260246000fd5b50919050565b61341080620002666000396000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c806370a0823111610186578063a22cb465116100e3578063e92d066011610097578063ef72f27611610071578063ef72f276146105ec578063efd0cbf9146105ff578063f2fde38b1461061257600080fd5b8063e92d0660146105b1578063e930105d146105d1578063e985e9c5146105d957600080fd5b8063b88d4fde116100c8578063b88d4fde14610578578063c87b56dd1461058b578063e2e784d51461059e57600080fd5b8063a22cb46514610552578063b28318f31461056557600080fd5b8063950bff9f1161013a57806398602a491161011f57806398602a491461050d57806398c83a16146105155780639a44f1fb1461052f57600080fd5b8063950bff9f146104fc57806395d89b411461050557600080fd5b80637e9845f51161016b5780637e9845f5146104c357806383ca36fe146104cb5780638da5cb5b146104eb57600080fd5b806370a082311461049d57806372dab0c0146104b057600080fd5b806332cb6b0c1161023457806363096509116101e857806367243482116101cd57806367243482146104645780636817031b146104775780636dfa99fd1461048a57600080fd5b8063630965091461043e5780636352211e1461045157600080fd5b80634f12ba9d116102195780634f12ba9d146104105780634f6ccce71461041857806355f804b31461042b57600080fd5b806332cb6b0c146103f457806342842e0e146103fd57600080fd5b806318160ddd1161028b57806323b872dd1161027057806323b872dd1461039c5780632a55205a146103af5780632f745c59146103e157600080fd5b806318160ddd1461037e57806321eea94e1461039457600080fd5b8063081812fc116102bc578063081812fc14610315578063095ea7b3146103565780630f12f6a21461036b57600080fd5b806301ffc9a7146102d857806306fdde0314610300575b600080fd5b6102eb6102e6366004612b1a565b610625565b60405190151581526020015b60405180910390f35b610308610645565b6040516102f79190612bb1565b61033e610323366004612bc4565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b610369610364366004612bf2565b6106d3565b005b610369610379366004612c1e565b61084c565b6103866108cd565b6040519081526020016102f7565b6103696108dc565b6103696103aa366004612c3b565b610ba2565b6103c26103bd366004612c7c565b610cfd565b604080516001600160a01b0390931683526020830191909152016102f7565b6103866103ef366004612bf2565b610d5d565b610386600b5481565b61036961040b366004612c3b565b610e2d565b610386600381565b610386610426366004612bc4565b610fdb565b610369610439366004612d1c565b611024565b61036961044c366004612dcf565b611082565b61033e61045f366004612bc4565b6110dc565b610369610472366004612e81565b611133565b610369610485366004612c1e565b6112c5565b610369610498366004612c1e565b611346565b6103866104ab366004612c1e565b6113a0565b6103696104be366004612bc4565b6113ab565b61038661164a565b6103866104d9366004612c1e565b600f6020526000908152604090205481565b6007546001600160a01b031661033e565b610386600c5481565b61030861165b565b610386600181565b61051d600281565b60405160ff90911681526020016102f7565b60075474010000000000000000000000000000000000000000900460ff1661051d565b610369610560366004612f43565b611668565b610369610573366004612c1e565b611742565b610369610586366004612f81565b6117c3565b610308610599366004612bc4565b6119a3565b6103696105ac366004612bf2565b611a3f565b6103866105bf366004612c1e565b600e6020526000908152604090205481565b61051d600381565b6102eb6105e7366004613020565b611a9f565b6103696105fa366004612c1e565b611ab2565b61036961060d366004612bc4565b611b0c565b610369610620366004612c1e565b611c79565b600061063082611d2a565b8061063f575061063f82611dc2565b92915050565b600180546106529061304e565b80601f016020809104026020016040519081016040528092919081815260200182805461067e9061304e565b80156106cb5780601f106106a0576101008083540402835291602001916106cb565b820191906000526020600020905b8154815290600101906020018083116106ae57829003601f168201915b505050505081565b806106dd81611ef2565b61071b576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b33600061072784611f09565b90506000610736828487611f60565b905080610789576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b816001600160a01b0316866001600160a01b031614156107e0576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b600085815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60075433906001600160a01b0316811461089d576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d7611fb5565b905090565b60075474010000000000000000000000000000000000000000900460ff1660038114610939576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610712565b336000818152600f60205260409020546001141561098e576040517f4b4c5ef10000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b600061099861164a565b600d54600b546109a891906130cb565b6109b291906130cb565b905060018110156109f9576040517f9abbab070000000000000000000000000000000000000000000000000000000081526001600482015260248101829052604401610712565b6011546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009283929116906370a0823190602401602060405180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8491906130e2565b90508015610a955760019150610b2c565b6012546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906130e2565b90508015610b2a57600192505b505b6001821015610b72576040517fb30ab1740000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610712565b6001600160a01b0384166000908152600f60205260409020600190819055610b9b908590611fbf565b5050505050565b80610bac81611ef2565b610be5576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b336000610bf184611f09565b9050806001600160a01b0316866001600160a01b031614610c3e576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610c4b828487611f60565b905080610c9e576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b6001600160a01b038616610ce9576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b610cf482878761210e565b50505050505050565b600080821580610d0d5750600954155b15610d27575050600a546001600160a01b03166000610d56565b600061271084600954610d3a91906130fb565b610d449190613167565b600a546001600160a01b031693509150505b9250929050565b6000610d68836122ab565b8210610db2576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610712565b600060015b600054811015610e2557610dca81611ef2565b8015610def5750610dda81611f09565b6001600160a01b0316856001600160a01b0316145b15610e135781841415610e0557915061063f9050565b81610e0f8161317b565b9250505b80610e1d8161317b565b915050610db7565b505092915050565b80610e3781611ef2565b610e70576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b336000610e7c84611f09565b9050806001600160a01b0316866001600160a01b031614610ec9576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ed6828487611f60565b905080610f29576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b6001600160a01b038616610f74576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b610f7f82878761210e565b610f9a8287876040518060200160405280600081525061235a565b610cf4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b6000610fe561164a565b8210611020576040517f125c19b000000000000000000000000000000000000000000000000000000000815260048101839052602401610712565b5090565b60075433906001600160a01b03168114611075576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e826124e2565b5050565b60075433906001600160a01b031681146110d3576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e826124f5565b6000816110e881611ef2565b611121576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b61112a83611f09565b91505b50919050565b60075433906001600160a01b03168114611184576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b825182518082146111cb576040517f23f901bf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610712565b6000815b801561121857856111e16001836130cb565b815181106111f1576111f16131b4565b60200260200101518261120491906131e3565b915080611210816131fb565b9150506111cf565b50600d5481111561126357600d546040517f016c69db000000000000000000000000000000000000000000000000000000008152610712918391600401918252602082015260400190565b600d8054829003905560005b83811015610cf4576112b387828151811061128c5761128c6131b4565b60200260200101518783815181106112a6576112a66131b4565b6020026020010151611fbf565b806112bd8161317b565b91505061126f565b60075433906001600160a01b03168114611316576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506010805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075433906001600160a01b03168114611397576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e82612573565b600061063f826122ab565b80806113e3576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff1660028114801590611416575060ff8116600314155b15611452576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610712565b336000818152600e6020526040902054600314156114a7576040517f4b4c5ef10000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b60006114b161164a565b600d54600b546114c191906130cb565b6114cb91906130cb565b905084811015611511576040517f9abbab070000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604401610712565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009216906370a0823190602401602060405180830381865afa158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906130e2565b905060006115a86003836130fb565b6001600160a01b0385166000908152600e60205260409020549091506115ce81836130cb565b881115611619576040517f3dae6a450000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101839052604401610712565b6001600160a01b0385166000908152600e6020526040902081890190556116408589611fbf565b5050505050505050565b600060016000546108d791906130cb565b600280546106529061304e565b336001600160a01b0383168114156116b7576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610712565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60075433906001600160a01b03168114611793576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b826117cd81611ef2565b611806576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b33600061181286611f09565b9050806001600160a01b0316886001600160a01b03161461185f576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061186c828489611f60565b9050806118bf576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101889052606401610712565b6001600160a01b03881661190a576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610712565b61191582898961210e565b61195782898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061235a92505050565b611998576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610712565b505050505050505050565b6060816119af81611ef2565b6119e8576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b6000600680546119f79061304e565b905011611a0c57611a07836126aa565b61112a565b6006611a17846126aa565b604051602001611a2892919061324c565b604051602081830303815290604052915050919050565b60075433906001600160a01b03168114611a90576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b611a9a83836127dc565b505050565b6000611aab8383612855565b9392505050565b60075433906001600160a01b03168114611b03576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e82612879565b8080611b44576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600114611bbb576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff166004820152602401610712565b600c54821115611c0557600c546040517f5aaca4e4000000000000000000000000000000000000000000000000000000008152610712918491600401918252602082015260400190565b6000611c0f61164a565b600d54600b54611c1f91906130cb565b611c2991906130cb565b905080831115611c6f576040517f9abbab070000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610712565b611a9a3384611fbf565b60075433906001600160a01b03168114611cca576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b600780546001600160a01b0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061063f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480611e5557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80611ea157507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061063f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b600081611f0157506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b038116611aab5781611f3c816131fb565b6000818152600560205260409020549093506001600160a01b03169150611f249050565b600080846001600160a01b0316846001600160a01b03161480611f9c57506000838152600360205260409020546001600160a01b038581169116145b80611fac5750611fac8585612855565b95945050505050565b60006108d761164a565b6000805490611fce83836131e3565b90506000611fdd6001836130cb565b6000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055905082811115612050576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387161790555b81600081905550612073600086856040518060200160405280600081525061235a565b6120b4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610712565b825b828110156121065760405181906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46120ff8161317b565b90506120b6565b505050505050565b6000818152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff1916905560018211612146576001612151565b6121516001836130cb565b905060006121608360016131e3565b905060008383108015612177575061217783611ef2565b801561219857506000838152600560205260409020546001600160a01b0316155b905060006121a583611ef2565b80156121c657506000838152600560205260409020546001600160a01b0316155b90508115612203576000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b801561223e576000838152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b600085815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b60006001600160a01b0382166122c357506000919050565b60008060015b600054811015612351576122dc81611ef2565b15612341576000818152600560205260409020546001600160a01b031615612319576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b03161415612341578261233d8161317b565b9350505b61234a8161317b565b90506122c9565b50909392505050565b6000833b80156124d4576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906123af9033908a9089908990600401613321565b6020604051808303816000875af1925050508015612408575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124059181019061335d565b60015b612487573d808015612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50805161247f576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491506124da9050565b60019150505b949350505050565b805161107e906006906020840190612a59565b6007805460ff838116740100000000000000000000000000000000000000008181027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff85161790945560405193909204169182907f7285522ec93a20dcefa1a1d057094a227073a5463b91c0c19a23c6ef5c9c1fe490600090a35050565b600854808015611a9a57808060019003915050826001600160a01b0316600882815481106125a3576125a36131b4565b6000918252602090912001546001600160a01b03161415611a9a57816125ca8260016131e3565b146126475760086125dc6001846130cb565b815481106125ec576125ec6131b4565b600091825260209091200154600880546001600160a01b039092169183908110612618576126186131b4565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60088054806126585761265861337a565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055505050565b6060816126ea57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561271457806126fe8161317b565b915061270d9050600a83613167565b91506126ee565b60008167ffffffffffffffff81111561272f5761272f612c9e565b6040519080825280601f01601f191660200182016040528015612759576020820181803683370190505b5090505b84156124da5761276e6001836130cb565b915061277b600a866133a9565b6127869060306131e3565b60f81b81838151811061279b5761279b6131b4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127d5600a86613167565b945061275d565b612710811115612823576040517f4ec3fd3a000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610712565b600955600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6010546000906001600160a01b0383811691161480611aab5750611aab838361292d565b6008545b80156128cd57808060019003915050816001600160a01b0316600882815481106128a9576128a96131b4565b6000918252602090912001546001600160a01b031614156128c8575050565b61287d565b50600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000612939838361296d565b80611aab57506001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16611aab565b6008546000905b8015612a4f57808060019003915050600060088281548110612998576129986131b4565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015612a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2f91906133bd565b6001600160a01b03161415612a495760019250505061063f565b50612974565b5060009392505050565b828054612a659061304e565b90600052602060002090601f016020900481019282612a875760008555612acd565b82601f10612aa057805160ff1916838001178555612acd565b82800160010185558215612acd579182015b82811115612acd578251825591602001919060010190612ab2565b506110209291505b808211156110205760008155600101612ad5565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612b1757600080fd5b50565b600060208284031215612b2c57600080fd5b8135611aab81612ae9565b60005b83811015612b52578181015183820152602001612b3a565b83811115612b61576000848401525b50505050565b60008151808452612b7f816020860160208601612b37565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aab6020830184612b67565b600060208284031215612bd657600080fd5b5035919050565b6001600160a01b0381168114612b1757600080fd5b60008060408385031215612c0557600080fd5b8235612c1081612bdd565b946020939093013593505050565b600060208284031215612c3057600080fd5b8135611aab81612bdd565b600080600060608486031215612c5057600080fd5b8335612c5b81612bdd565b92506020840135612c6b81612bdd565b929592945050506040919091013590565b60008060408385031215612c8f57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612d1457612d14612c9e565b604052919050565b60006020808385031215612d2f57600080fd5b823567ffffffffffffffff80821115612d4757600080fd5b818501915085601f830112612d5b57600080fd5b813581811115612d6d57612d6d612c9e565b612d9d847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612ccd565b91508082528684828501011115612db357600080fd5b8084840185840137600090820190930192909252509392505050565b600060208284031215612de157600080fd5b813560ff81168114611aab57600080fd5b600067ffffffffffffffff821115612e0c57612e0c612c9e565b5060051b60200190565b600082601f830112612e2757600080fd5b81356020612e3c612e3783612df2565b612ccd565b82815260059290921b84018101918181019086841115612e5b57600080fd5b8286015b84811015612e765780358352918301918301612e5f565b509695505050505050565b60008060408385031215612e9457600080fd5b823567ffffffffffffffff80821115612eac57600080fd5b818501915085601f830112612ec057600080fd5b81356020612ed0612e3783612df2565b82815260059290921b84018101918181019089841115612eef57600080fd5b948201945b83861015612f16578535612f0781612bdd565b82529482019490820190612ef4565b96505086013592505080821115612f2c57600080fd5b50612f3985828601612e16565b9150509250929050565b60008060408385031215612f5657600080fd5b8235612f6181612bdd565b915060208301358015158114612f7657600080fd5b809150509250929050565b600080600080600060808688031215612f9957600080fd5b8535612fa481612bdd565b94506020860135612fb481612bdd565b935060408601359250606086013567ffffffffffffffff80821115612fd857600080fd5b818801915088601f830112612fec57600080fd5b813581811115612ffb57600080fd5b89602082850101111561300d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561303357600080fd5b823561303e81612bdd565b91506020830135612f7681612bdd565b600181811c9082168061306257607f821691505b6020821081141561112d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156130dd576130dd61309c565b500390565b6000602082840312156130f457600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131335761313361309c565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261317657613176613138565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ad576131ad61309c565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082198211156131f6576131f661309c565b500190565b60008161320a5761320a61309c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008151613242818560208601612b37565b9290920192915050565b600080845481600182811c91508083168061326857607f831692505b60208084108214156132a1577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156132b557600181146132e457613311565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613311565b60008b81526020902060005b868110156133095781548b8201529085019083016132f0565b505084890196505b505050505050611fac8185613230565b60006001600160a01b038087168352808616602084015250836040830152608060608301526133536080830184612b67565b9695505050505050565b60006020828403121561336f57600080fd5b8151611aab81612ae9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826133b8576133b8613138565b500690565b6000602082840312156133cf57600080fd5b8151611aab81612bdd56fea2646970667358221220064bde2f5fb841468a3bd4a9838cb30855ff3ce566739907b061c8ff5c0626de64736f6c634300080a003368747470733a2f2f636f6c6c6563746f7273636c75622e696f2f6170692f676d6572732f6d657461646174613f746f6b656e49643d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d35760003560e01c806370a0823111610186578063a22cb465116100e3578063e92d066011610097578063ef72f27611610071578063ef72f276146105ec578063efd0cbf9146105ff578063f2fde38b1461061257600080fd5b8063e92d0660146105b1578063e930105d146105d1578063e985e9c5146105d957600080fd5b8063b88d4fde116100c8578063b88d4fde14610578578063c87b56dd1461058b578063e2e784d51461059e57600080fd5b8063a22cb46514610552578063b28318f31461056557600080fd5b8063950bff9f1161013a57806398602a491161011f57806398602a491461050d57806398c83a16146105155780639a44f1fb1461052f57600080fd5b8063950bff9f146104fc57806395d89b411461050557600080fd5b80637e9845f51161016b5780637e9845f5146104c357806383ca36fe146104cb5780638da5cb5b146104eb57600080fd5b806370a082311461049d57806372dab0c0146104b057600080fd5b806332cb6b0c1161023457806363096509116101e857806367243482116101cd57806367243482146104645780636817031b146104775780636dfa99fd1461048a57600080fd5b8063630965091461043e5780636352211e1461045157600080fd5b80634f12ba9d116102195780634f12ba9d146104105780634f6ccce71461041857806355f804b31461042b57600080fd5b806332cb6b0c146103f457806342842e0e146103fd57600080fd5b806318160ddd1161028b57806323b872dd1161027057806323b872dd1461039c5780632a55205a146103af5780632f745c59146103e157600080fd5b806318160ddd1461037e57806321eea94e1461039457600080fd5b8063081812fc116102bc578063081812fc14610315578063095ea7b3146103565780630f12f6a21461036b57600080fd5b806301ffc9a7146102d857806306fdde0314610300575b600080fd5b6102eb6102e6366004612b1a565b610625565b60405190151581526020015b60405180910390f35b610308610645565b6040516102f79190612bb1565b61033e610323366004612bc4565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b610369610364366004612bf2565b6106d3565b005b610369610379366004612c1e565b61084c565b6103866108cd565b6040519081526020016102f7565b6103696108dc565b6103696103aa366004612c3b565b610ba2565b6103c26103bd366004612c7c565b610cfd565b604080516001600160a01b0390931683526020830191909152016102f7565b6103866103ef366004612bf2565b610d5d565b610386600b5481565b61036961040b366004612c3b565b610e2d565b610386600381565b610386610426366004612bc4565b610fdb565b610369610439366004612d1c565b611024565b61036961044c366004612dcf565b611082565b61033e61045f366004612bc4565b6110dc565b610369610472366004612e81565b611133565b610369610485366004612c1e565b6112c5565b610369610498366004612c1e565b611346565b6103866104ab366004612c1e565b6113a0565b6103696104be366004612bc4565b6113ab565b61038661164a565b6103866104d9366004612c1e565b600f6020526000908152604090205481565b6007546001600160a01b031661033e565b610386600c5481565b61030861165b565b610386600181565b61051d600281565b60405160ff90911681526020016102f7565b60075474010000000000000000000000000000000000000000900460ff1661051d565b610369610560366004612f43565b611668565b610369610573366004612c1e565b611742565b610369610586366004612f81565b6117c3565b610308610599366004612bc4565b6119a3565b6103696105ac366004612bf2565b611a3f565b6103866105bf366004612c1e565b600e6020526000908152604090205481565b61051d600381565b6102eb6105e7366004613020565b611a9f565b6103696105fa366004612c1e565b611ab2565b61036961060d366004612bc4565b611b0c565b610369610620366004612c1e565b611c79565b600061063082611d2a565b8061063f575061063f82611dc2565b92915050565b600180546106529061304e565b80601f016020809104026020016040519081016040528092919081815260200182805461067e9061304e565b80156106cb5780601f106106a0576101008083540402835291602001916106cb565b820191906000526020600020905b8154815290600101906020018083116106ae57829003601f168201915b505050505081565b806106dd81611ef2565b61071b576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b33600061072784611f09565b90506000610736828487611f60565b905080610789576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b816001600160a01b0316866001600160a01b031614156107e0576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b600085815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60075433906001600160a01b0316811461089d576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006108d7611fb5565b905090565b60075474010000000000000000000000000000000000000000900460ff1660038114610939576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610712565b336000818152600f60205260409020546001141561098e576040517f4b4c5ef10000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b600061099861164a565b600d54600b546109a891906130cb565b6109b291906130cb565b905060018110156109f9576040517f9abbab070000000000000000000000000000000000000000000000000000000081526001600482015260248101829052604401610712565b6011546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009283929116906370a0823190602401602060405180830381865afa158015610a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8491906130e2565b90508015610a955760019150610b2c565b6012546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d91906130e2565b90508015610b2a57600192505b505b6001821015610b72576040517fb30ab1740000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610712565b6001600160a01b0384166000908152600f60205260409020600190819055610b9b908590611fbf565b5050505050565b80610bac81611ef2565b610be5576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b336000610bf184611f09565b9050806001600160a01b0316866001600160a01b031614610c3e576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610c4b828487611f60565b905080610c9e576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b6001600160a01b038616610ce9576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b610cf482878761210e565b50505050505050565b600080821580610d0d5750600954155b15610d27575050600a546001600160a01b03166000610d56565b600061271084600954610d3a91906130fb565b610d449190613167565b600a546001600160a01b031693509150505b9250929050565b6000610d68836122ab565b8210610db2576040517f374f8b4f0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610712565b600060015b600054811015610e2557610dca81611ef2565b8015610def5750610dda81611f09565b6001600160a01b0316856001600160a01b0316145b15610e135781841415610e0557915061063f9050565b81610e0f8161317b565b9250505b80610e1d8161317b565b915050610db7565b505092915050565b80610e3781611ef2565b610e70576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b336000610e7c84611f09565b9050806001600160a01b0316866001600160a01b031614610ec9576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ed6828487611f60565b905080610f29576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101869052606401610712565b6001600160a01b038616610f74576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b610f7f82878761210e565b610f9a8287876040518060200160405280600081525061235a565b610cf4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b6000610fe561164a565b8210611020576040517f125c19b000000000000000000000000000000000000000000000000000000000815260048101839052602401610712565b5090565b60075433906001600160a01b03168114611075576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e826124e2565b5050565b60075433906001600160a01b031681146110d3576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e826124f5565b6000816110e881611ef2565b611121576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b61112a83611f09565b91505b50919050565b60075433906001600160a01b03168114611184576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b825182518082146111cb576040517f23f901bf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610712565b6000815b801561121857856111e16001836130cb565b815181106111f1576111f16131b4565b60200260200101518261120491906131e3565b915080611210816131fb565b9150506111cf565b50600d5481111561126357600d546040517f016c69db000000000000000000000000000000000000000000000000000000008152610712918391600401918252602082015260400190565b600d8054829003905560005b83811015610cf4576112b387828151811061128c5761128c6131b4565b60200260200101518783815181106112a6576112a66131b4565b6020026020010151611fbf565b806112bd8161317b565b91505061126f565b60075433906001600160a01b03168114611316576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506010805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60075433906001600160a01b03168114611397576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e82612573565b600061063f826122ab565b80806113e3576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff1660028114801590611416575060ff8116600314155b15611452576040517f81d1489b00000000000000000000000000000000000000000000000000000000815260ff82166004820152602401610712565b336000818152600e6020526040902054600314156114a7576040517f4b4c5ef10000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b60006114b161164a565b600d54600b546114c191906130cb565b6114cb91906130cb565b905084811015611511576040517f9abbab070000000000000000000000000000000000000000000000000000000081526004810186905260248101829052604401610712565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009216906370a0823190602401602060405180830381865afa158015611575573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159991906130e2565b905060006115a86003836130fb565b6001600160a01b0385166000908152600e60205260409020549091506115ce81836130cb565b881115611619576040517f3dae6a450000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101839052604401610712565b6001600160a01b0385166000908152600e6020526040902081890190556116408589611fbf565b5050505050505050565b600060016000546108d791906130cb565b600280546106529061304e565b336001600160a01b0383168114156116b7576040517ff2b21e1c0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610712565b6001600160a01b0381811660008181526004602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60075433906001600160a01b03168114611793576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b506012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b826117cd81611ef2565b611806576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b33600061181286611f09565b9050806001600160a01b0316886001600160a01b03161461185f576040517fa0db9ec600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061186c828489611f60565b9050806118bf576040517f19f48dff0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528416602482015260448101889052606401610712565b6001600160a01b03881661190a576040517ff35b2e070000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610712565b61191582898961210e565b61195782898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061235a92505050565b611998576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0389166004820152602401610712565b505050505050505050565b6060816119af81611ef2565b6119e8576040517f1cf4d9a400000000000000000000000000000000000000000000000000000000815260048101829052602401610712565b6000600680546119f79061304e565b905011611a0c57611a07836126aa565b61112a565b6006611a17846126aa565b604051602001611a2892919061324c565b604051602081830303815290604052915050919050565b60075433906001600160a01b03168114611a90576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b611a9a83836127dc565b505050565b6000611aab8383612855565b9392505050565b60075433906001600160a01b03168114611b03576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b61107e82612879565b8080611b44576040517f7fcfed3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075474010000000000000000000000000000000000000000900460ff16600114611bbb576007546040517f81d1489b0000000000000000000000000000000000000000000000000000000081527401000000000000000000000000000000000000000090910460ff166004820152602401610712565b600c54821115611c0557600c546040517f5aaca4e4000000000000000000000000000000000000000000000000000000008152610712918491600401918252602082015260400190565b6000611c0f61164a565b600d54600b54611c1f91906130cb565b611c2991906130cb565b905080831115611c6f576040517f9abbab070000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610712565b611a9a3384611fbf565b60075433906001600160a01b03168114611cca576040517fb4f195e60000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610712565b600780546001600160a01b0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061063f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480611e5557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80611ea157507fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061063f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b600081611f0157506000919050565b506000541190565b60008181526005602052604081205482906001600160a01b03165b6001600160a01b038116611aab5781611f3c816131fb565b6000818152600560205260409020549093506001600160a01b03169150611f249050565b600080846001600160a01b0316846001600160a01b03161480611f9c57506000838152600360205260409020546001600160a01b038581169116145b80611fac5750611fac8585612855565b95945050505050565b60006108d761164a565b6000805490611fce83836131e3565b90506000611fdd6001836130cb565b6000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055905082811115612050576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387161790555b81600081905550612073600086856040518060200160405280600081525061235a565b6120b4576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610712565b825b828110156121065760405181906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46120ff8161317b565b90506120b6565b505050505050565b6000818152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff1916905560018211612146576001612151565b6121516001836130cb565b905060006121608360016131e3565b905060008383108015612177575061217783611ef2565b801561219857506000838152600560205260409020546001600160a01b0316155b905060006121a583611ef2565b80156121c657506000838152600560205260409020546001600160a01b0316155b90508115612203576000848152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b801561223e576000838152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0389161790555b600085815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918b16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050505050565b60006001600160a01b0382166122c357506000919050565b60008060015b600054811015612351576122dc81611ef2565b15612341576000818152600560205260409020546001600160a01b031615612319576000818152600560205260409020546001600160a01b031691505b816001600160a01b0316856001600160a01b03161415612341578261233d8161317b565b9350505b61234a8161317b565b90506122c9565b50909392505050565b6000833b80156124d4576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063150b7a02906123af9033908a9089908990600401613321565b6020604051808303816000875af1925050508015612408575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526124059181019061335d565b60015b612487573d808015612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50805161247f576040517f015be56a0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610712565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001491506124da9050565b60019150505b949350505050565b805161107e906006906020840190612a59565b6007805460ff838116740100000000000000000000000000000000000000008181027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff85161790945560405193909204169182907f7285522ec93a20dcefa1a1d057094a227073a5463b91c0c19a23c6ef5c9c1fe490600090a35050565b600854808015611a9a57808060019003915050826001600160a01b0316600882815481106125a3576125a36131b4565b6000918252602090912001546001600160a01b03161415611a9a57816125ca8260016131e3565b146126475760086125dc6001846130cb565b815481106125ec576125ec6131b4565b600091825260209091200154600880546001600160a01b039092169183908110612618576126186131b4565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60088054806126585761265861337a565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101805473ffffffffffffffffffffffffffffffffffffffff19169055019055505050565b6060816126ea57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561271457806126fe8161317b565b915061270d9050600a83613167565b91506126ee565b60008167ffffffffffffffff81111561272f5761272f612c9e565b6040519080825280601f01601f191660200182016040528015612759576020820181803683370190505b5090505b84156124da5761276e6001836130cb565b915061277b600a866133a9565b6127869060306131e3565b60f81b81838151811061279b5761279b6131b4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506127d5600a86613167565b945061275d565b612710811115612823576040517f4ec3fd3a000000000000000000000000000000000000000000000000000000008152600481018290526127106024820152604401610712565b600955600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6010546000906001600160a01b0383811691161480611aab5750611aab838361292d565b6008545b80156128cd57808060019003915050816001600160a01b0316600882815481106128a9576128a96131b4565b6000918252602090912001546001600160a01b031614156128c8575050565b61287d565b50600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000612939838361296d565b80611aab57506001600160a01b0380841660009081526004602090815260408083209386168352929052205460ff16611aab565b6008546000905b8015612a4f57808060019003915050600060088281548110612998576129986131b4565b6000918252602090912001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216925090851690829063c455279190602401602060405180830381865afa158015612a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2f91906133bd565b6001600160a01b03161415612a495760019250505061063f565b50612974565b5060009392505050565b828054612a659061304e565b90600052602060002090601f016020900481019282612a875760008555612acd565b82601f10612aa057805160ff1916838001178555612acd565b82800160010185558215612acd579182015b82811115612acd578251825591602001919060010190612ab2565b506110209291505b808211156110205760008155600101612ad5565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612b1757600080fd5b50565b600060208284031215612b2c57600080fd5b8135611aab81612ae9565b60005b83811015612b52578181015183820152602001612b3a565b83811115612b61576000848401525b50505050565b60008151808452612b7f816020860160208601612b37565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aab6020830184612b67565b600060208284031215612bd657600080fd5b5035919050565b6001600160a01b0381168114612b1757600080fd5b60008060408385031215612c0557600080fd5b8235612c1081612bdd565b946020939093013593505050565b600060208284031215612c3057600080fd5b8135611aab81612bdd565b600080600060608486031215612c5057600080fd5b8335612c5b81612bdd565b92506020840135612c6b81612bdd565b929592945050506040919091013590565b60008060408385031215612c8f57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612d1457612d14612c9e565b604052919050565b60006020808385031215612d2f57600080fd5b823567ffffffffffffffff80821115612d4757600080fd5b818501915085601f830112612d5b57600080fd5b813581811115612d6d57612d6d612c9e565b612d9d847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612ccd565b91508082528684828501011115612db357600080fd5b8084840185840137600090820190930192909252509392505050565b600060208284031215612de157600080fd5b813560ff81168114611aab57600080fd5b600067ffffffffffffffff821115612e0c57612e0c612c9e565b5060051b60200190565b600082601f830112612e2757600080fd5b81356020612e3c612e3783612df2565b612ccd565b82815260059290921b84018101918181019086841115612e5b57600080fd5b8286015b84811015612e765780358352918301918301612e5f565b509695505050505050565b60008060408385031215612e9457600080fd5b823567ffffffffffffffff80821115612eac57600080fd5b818501915085601f830112612ec057600080fd5b81356020612ed0612e3783612df2565b82815260059290921b84018101918181019089841115612eef57600080fd5b948201945b83861015612f16578535612f0781612bdd565b82529482019490820190612ef4565b96505086013592505080821115612f2c57600080fd5b50612f3985828601612e16565b9150509250929050565b60008060408385031215612f5657600080fd5b8235612f6181612bdd565b915060208301358015158114612f7657600080fd5b809150509250929050565b600080600080600060808688031215612f9957600080fd5b8535612fa481612bdd565b94506020860135612fb481612bdd565b935060408601359250606086013567ffffffffffffffff80821115612fd857600080fd5b818801915088601f830112612fec57600080fd5b813581811115612ffb57600080fd5b89602082850101111561300d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561303357600080fd5b823561303e81612bdd565b91506020830135612f7681612bdd565b600181811c9082168061306257607f821691505b6020821081141561112d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156130dd576130dd61309c565b500390565b6000602082840312156130f457600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131335761313361309c565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261317657613176613138565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131ad576131ad61309c565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082198211156131f6576131f661309c565b500190565b60008161320a5761320a61309c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008151613242818560208601612b37565b9290920192915050565b600080845481600182811c91508083168061326857607f831692505b60208084108214156132a1577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156132b557600181146132e457613311565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650613311565b60008b81526020902060005b868110156133095781548b8201529085019083016132f0565b505084890196505b505050505050611fac8185613230565b60006001600160a01b038087168352808616602084015250836040830152608060608301526133536080830184612b67565b9695505050505050565b60006020828403121561336f57600080fd5b8151611aab81612ae9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826133b8576133b8613138565b500690565b6000602082840312156133cf57600080fd5b8151611aab81612bdd56fea2646970667358221220064bde2f5fb841468a3bd4a9838cb30855ff3ce566739907b061c8ff5c0626de64736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.