Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 16947758 | 676 days ago | IN | 0 ETH | 0.00726171 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
DefinitelyNotAliens
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./DNA_Mint.sol"; /* ██████ ███████ ███████ ██ ███ ██ ██ ████████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ █████ ██ ██ ██ ██ ██ ██ █████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ███████ ██ ██ ██ ████ ██ ██ ███████ ███████ ██ ███ ██ ██████ ████████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██████ ██ █████ ██ ██ ███████ ███ ██ ███████ ██ ██ ██ ██ ██ ████ ██ ██ ███████ ██ ██ █████ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ███████ ██ ████ ███████ taking the fiction out of science fiction DefinitelyNotAliens.io vision: @0xJLevi art: @Mr_Thursby dev: @0xSomeGuy */ contract DefinitelyNotAliens is DNAMint { function initialize() public initializer { AlienPrice = .051 ether; PaymentPlanPrice = .0123 ether; MaxMintPerAddress = 10; MaxFreePerAddress = 1; CurrentTokenIndex = 1; ReentrantStatus = NotEntered; __Ownable_init(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./DNA_Token.sol"; contract DNAMint is DNAToken { /* ███ ███ ██ ███ ██ ████████ ████ ████ ██ ████ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ */ // free mint alien function freeMintAlien(uint256 _quantity) external nonReentrant { // check for active mint first if(!IsFreeMintActive) revert LoveTheExcitementButMintIsNotActive(); // contracts cant mint 😢 if (isContract(msg.sender)) revert SorryFriendContractsCantMint(); // check if able to mint quantity if (CurrentTokenIndex > MaxFreeMints) revert AhManWeAreAllOutOfFreeTokens(); // check address not minting too many if (AddressDataMap[msg.sender].numMinted + _quantity > MaxFreePerAddress) revert LoveTheSupportButCantMintThatManyFreeTokens(); _freeMint(msg.sender, _quantity); } // internal mint function function _freeMint(address _to, uint256 _quantity) private { // check if _to is zero address if(_to == address(0)) revert WeDontMintToTheZeroAddressDuh(); unchecked { // update address data AddressDataMap[_to].numMinted += uint16(_quantity); AddressDataMap[_to].numMintedFree += uint16(_quantity); AddressDataMap[_to].balance += uint16(_quantity); TokenData storage thisTokenData = TokenDataMap[CurrentTokenIndex]; // update token data thisTokenData.tokenOwner = _to; thisTokenData.emergenceDate = uint64(block.timestamp); thisTokenData.ownedSince = uint64(block.timestamp); // emit transfer events uint256 end = CurrentTokenIndex + _quantity; while(CurrentTokenIndex < end) { // emit transfer event emit Transfer(address(0), _to, CurrentTokenIndex); // update token counter CurrentTokenIndex++; } // update total counts TotalMinted += _quantity; TotalMintedFree += _quantity; } } // public mint alien function publicMintAlien(uint256 _quantity, bool _paymentPlan) external payable nonReentrant { // check for active mint first if(!IsPublicMintActive) revert LoveTheExcitementButMintIsNotActive(); // contracts cant mint 😢 if (isContract(msg.sender)) revert SorryFriendContractsCantMint(); // check if able to mint quantity if (TotalMinted + ReserveUsed + _quantity > CollectionSize) revert WeWouldBreakIfWeMintedThisMany(); // check address not minting too many if (AddressDataMap[msg.sender].numMinted + _quantity > MaxMintPerAddress) revert LoveTheSupportButCantMintThatMany(); unchecked { // calculate cost uint256 tokenPrice; // determine which price to use if(_paymentPlan) { tokenPrice = PaymentPlanPrice; } else { tokenPrice = AlienPrice; } // get total cost uint256 totalCost = tokenPrice*_quantity; // check if value sent is correct if (totalCost != msg.value) revert ReallyWantToMintForYouButNotTheRightFunds(); // MINT THEM THANGS! _mint(msg.sender, _quantity, _paymentPlan); } } // internal mint function function _mint(address _to, uint256 _quantity, bool _paymentPlan) private { // check if _to is zero address if(_to == address(0)) revert WeDontMintToTheZeroAddressDuh(); unchecked { // update address data AddressDataMap[_to].numMinted += uint16(_quantity); AddressDataMap[_to].balance += uint16(_quantity); // get start and end indices uint256 curTokenIndex = CurrentTokenIndex; uint256 end = curTokenIndex + _quantity; // update owner, timestamp, emergence date TokenData storage thisTokenData = TokenDataMap[CurrentTokenIndex]; thisTokenData.tokenOwner = _to; thisTokenData.ownedSince = uint64(block.timestamp); thisTokenData.emergenceDate = uint64(block.timestamp); // update mint counts TotalMinted += _quantity; // mint payment plan tokens if(_paymentPlan) { // update payment data and emit transfer events for logging while(curTokenIndex < end) { PaymentDataMap[curTokenIndex] = AlienPrice - PaymentPlanPrice; emit Transfer(address(0), _to, curTokenIndex++); } } else // mint all fully purchased tokens { // emit transfer events for logging while (curTokenIndex < end) { emit Transfer(address(0), _to, curTokenIndex++); } } // update current index CurrentTokenIndex = curTokenIndex; } } // make payment for token function makePayment(uint256 _tokenId) external payable { // get token data TokenData memory tokenData = getTokenData(_tokenId); // check if owner if(msg.sender != tokenData.tokenOwner) revert WeNeedTheTokenOwnerToCallThis(); // check if paid off already if(PaymentDataMap[_tokenId] == 0) revert ThisTokenIsAlreadyPaidOff(); // update remaining amount uint256 remainingBalance = PaymentDataMap[_tokenId]; // process payments unchecked { // overpayment if(msg.value > remainingBalance) { // get refund amount uint256 refund = msg.value - PaymentDataMap[_tokenId]; // update remaining value PaymentDataMap[_tokenId] = 0; // send refund bool sent = payable(msg.sender).send(refund); // revert if unsuccessful if(!sent) revert UnableToProcessRefund(); } else if(msg.value == remainingBalance) // exact payment { // update remaining value PaymentDataMap[_tokenId] = 0; } else // under payment { PaymentDataMap[_tokenId] = remainingBalance - msg.value; } } } /* ████████ ███████ █████ ███ ███ ██ ██ ██ ██ ████ ████ ██ █████ ███████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ███████ ██ ██ ██ ███████ ███ ██ ██ ████████ ██ ██ ██ ██ ███ ████ ██ ██ ██ ███████ ███████ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ███████ ██ ████ ██ ██ */ // toggle free mint function toggleFreeMintStatus() external onlyOwner { IsFreeMintActive = !IsFreeMintActive; } // toggle public mint function togglePublicMintStatus() external onlyOwner { IsPublicMintActive = !IsPublicMintActive; } // update mint details function updateMintDetails(uint256 _newMintPrice, uint256 _newPlanPrice, uint256 _newMaxMint, uint256 _newMaxFree) external onlyOwner { AlienPrice = _newMintPrice; PaymentPlanPrice = _newPlanPrice; MaxMintPerAddress = _newMaxMint; MaxFreePerAddress = _newMaxFree; } // mint for team members function teamMemberMint(uint256 _quantity, address _to) external onlyOwner nonReentrant { // check if quantity can be minted if(_quantity > MaxReserve - ReserveUsed) revert WeKnowYoureTheOwnerAndAllButYouCantMintThatMany(); // update reserve count ReserveUsed += _quantity; // total minted updated here _mint(_to, _quantity, false); } // reclaim any unpaid tokens function reclaimToken(uint256[] memory _tokenIds) external onlyOwner { unchecked { for(uint256 i=0; i<_tokenIds.length; ++i) { uint256 tokenId = _tokenIds[i]; TokenData memory tokenData = getTokenData(tokenId); // check if fully paid if(PaymentDataMap[tokenId] > 0) { // check if minted greater than 90 days if(block.timestamp - tokenData.ownedSince > PaymentPlanTime) { // reclaim // update balances AddressDataMap[tokenData.tokenOwner].balance -= 1; AddressDataMap[owner()].balance += 1; TokenData storage thisTokenData = TokenDataMap[tokenId]; // update emergence date if owner is address(0) if(thisTokenData.tokenOwner == address(0)) { thisTokenData.emergenceDate = tokenData.emergenceDate; } // udpate ownership, timestamp, and timesTransferred thisTokenData.tokenOwner = owner(); thisTokenData.ownedSince = uint64(block.timestamp); thisTokenData.teleportationCount = 0; // if _tokenId+1 owner is not set, set originator as owner uint256 nextTokenId = tokenId + 1; // check if next token exists bool nextTokenExists = nextTokenId < CurrentTokenIndex; TokenData storage nextTokenData = TokenDataMap[nextTokenId]; // if _tokenId+1 owner is not set and token exists, set originator as owner if (nextTokenData.tokenOwner == address(0) && nextTokenExists) { nextTokenData.tokenOwner = tokenData.tokenOwner; nextTokenData.ownedSince = tokenData.ownedSince; nextTokenData.emergenceDate = tokenData.emergenceDate; } // refund any cost // get refund amount uint256 refund = AlienPrice - PaymentDataMap[tokenId]; // update remaining value PaymentDataMap[tokenId] = 0; // send refund bool sent = payable(tokenData.tokenOwner).send(refund); // revert if unsuccessful if(!sent) revert UnableToProcessRefund(); // emit transfer event emit Transfer(tokenData.tokenOwner, owner(), tokenId); } } } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./DNA_Common.sol"; contract DNAToken is DNACommon { /* ███████ ██████ ██████ ██ ██████ ███████ ██ ██ ██ ██ ███ ██ ██ █████ ██████ ██ ██ ███████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██████ ██ ██████ ███████ */ // see IERC165 supportsInterface function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { return _interfaceId == 0x80ac58cd || // erc721 _interfaceId == 0x5b5e139f || // erc721-metadata _interfaceId == 0x01ffc9a7; // erc165 } /* ███████ ██████ ██████ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ███ █████ ██████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██████ ██ ███████ ██ */ // see IERC721 balanceOf function balanceOf(address _address) public view returns (uint256) { // check if query is for address(0) if(_address == address(0)) revert WeDontCheckBalancesForTheZeroAddressHere(); // return the balance return AddressDataMap[_address].balance; } // see IERC721 ownerOf function ownerOf(uint256 _tokenId) public view returns (address) { // using getTokenData since this is a batch mint, some TokenToData[_tokenId].tokenOwner are address(0) TokenData memory tokenData = getTokenData(_tokenId); return tokenData.delegate == address(0) ? tokenData.tokenOwner : tokenData.delegate; } // see IERC721 safeTransferFrom function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public { // transfer token first so changes are updated _transfer(_from, _to, _tokenId); // if _to is a contract, ensure it implements IERC721Receiver-onERC721Received if (isContract(_to) && !_checkContractOnERC721Received(_from, _to, _tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } // see IERC721 safeTransferFrom function safeTransferFrom(address _from, address _to, uint256 _tokenId) public { // transfer token safeTransferFrom(_from, _to, _tokenId, ''); } // see IERC721 transferFrom function transferFrom(address _from, address _to, uint256 _tokenId) public { // transfer token _transfer(_from, _to, _tokenId); } // see IERC721 approve function approve(address _to, uint256 _tokenId) public { // get token owner address tokenOwner = getTokenData(_tokenId).tokenOwner; // check if trying to approve owner if (_to == tokenOwner) revert OwnersDontNeedApprovalDuh(); // ensure owner or operator is calling function if (msg.sender != tokenOwner && !isApprovedForAll(tokenOwner, msg.sender)) revert StopTryingToApproveIfYoureNotTheOwnerOrApproved(); // check if token is paid off if(PaymentDataMap[_tokenId] > 0) revert UnableToSetApproverForTokenOnPaymentPlan(); // set approval _approve(tokenOwner, _to, _tokenId); } // see IERC721 setApprovalForAll function setApprovalForAll(address _operator, bool _approved) public { _setApprovalForAll(msg.sender, _operator, _approved); } // see IERC721 getApproved function getApproved(uint256 _tokenId) public view tokenMustExist(_tokenId) returns (address) { // return approver of _tokenId return TokenApprovals[_tokenId]; } // see IERC721 isApprovedForAll function isApprovedForAll(address _tokenOwner, address _operator) public view returns (bool) { // return _operator approval status of _tokenOwner tokens return OperatorApprovals[_tokenOwner][_operator]; } /* ███████ ██████ ██████ ███████ ██████ ██ ███ ███ ███████ ████████ █████ ██████ █████ ████████ █████ ██ ██ ██ ██ ██ ██ ███ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ █████ ██ █████ ██ ████ ██ █████ ██ ███████ ██ ██ ███████ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██████ ██ ███████ ██ ██ ██ ███████ ██ ██ ██ ██████ ██ ██ ██ ██ ██ */ // get project name function name() public pure returns (string memory) { return ProjectName; } // get project symbol function symbol() public pure returns (string memory) { return ProjectSymbol; } // get token URI function tokenURI(uint256 _tokenId) public view tokenMustExist(_tokenId) returns (string memory) { // return base uri with token index return string.concat(MothershipCoordinates, toString(_tokenId)); } /* ██████ ███████ ███ ██ ███████ ██████ █████ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ███ █████ ██ ██ ██ █████ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ███████ ██ ████ ███████ ██ ██ ██ ██ ███████ */ // get token data function getTokenData(uint256 _tokenId) public view tokenMustExist(_tokenId) returns (TokenData memory) { // get token data TokenData memory tokenData = TokenDataMap[_tokenId]; // if token owner is not address(0), return the data if (tokenData.tokenOwner != address(0)) { return tokenData; } // create temporary token id uint256 tempTokenId = _tokenId; // there will always be an owner before a 0 address owner, avoiding underflow for(;;) { // using unchecked to reduce gas unchecked { // decrement token index tempTokenId--; } // when owner found, update owner and ownedSince properties if (TokenDataMap[tempTokenId].tokenOwner != address(0)) { TokenData memory parentTokenData = TokenDataMap[tempTokenId]; // update owner, emergence date (mint date), and owned time from parent tokenData.tokenOwner = parentTokenData.tokenOwner; tokenData.emergenceDate = parentTokenData.emergenceDate; tokenData.ownedSince = parentTokenData.ownedSince; return tokenData; } } // catch all to avoid no exit warning revert AhemThisTokenDoesntExist(); } // get address data function getAddressData(address _address) public view returns(AddressData memory) { return AddressDataMap[_address]; } // get payment data function getPaymentData(uint256 _tokenId) external view returns(uint256) { return PaymentDataMap[_tokenId]; } // delegate token usage to another address function delegateToken(uint256 _tokenId, address _to) external { // get token data (this checks if token exists) TokenData memory tokenData = getTokenData(_tokenId); // check if msg.sender is owner if(msg.sender != tokenData.tokenOwner) revert WeNeedTheTokenOwnerToCallThis(); // check if msg.sender is owner if(_to == tokenData.tokenOwner) revert DontNeedToDelegateTheOwnerDuh(); // check if delegating to same token if(tokenData.delegate == _to) revert ThatAddressIsAlreadyDelegatedHomie(); // check if token is paid off if(PaymentDataMap[_tokenId] > 0) revert JustNeedToPayOffTheTokenToDelegate(); // update delegated timestamp TokenDataMap[_tokenId].delegatedSince = uint64(block.timestamp); // emit transfer event for marketplaces if(_to == address(0)) { emit Transfer(tokenData.delegate, tokenData.tokenOwner, _tokenId); } else { if(tokenData.delegate == address(0)) { emit Transfer(tokenData.tokenOwner, _to, _tokenId); } else { emit Transfer(tokenData.delegate, _to, _tokenId); } } // update delegate TokenDataMap[_tokenId].delegate = _to; } /* ██ ███ ██ ████████ ███████ ██████ ███ ██ █████ ██ ██ ████ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██████ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ███████ ██ ██ ██ ████ ██ ██ ███████ */ // internal transfer function function _transfer(address _from, address _to, uint256 _tokenId) private { // get token data TokenData memory tokenData = getTokenData(_tokenId); // check _from is owner if (_from != tokenData.tokenOwner) revert TheFromAddressNeedsToBeTheOwnerPlease(); // check for proper transfer approval bool isApprovedOrOwner = ( msg.sender == _from || isApprovedForAll(_from, msg.sender) || getApproved(_tokenId) == msg.sender ); // revert if not approved if (!isApprovedOrOwner) revert WhyAreYouTryingToTransferTheTokenIfYoureNotTheOwnerOrApproved(); // check if token is paid off if(PaymentDataMap[_tokenId] > 0) revert UnableToTransferTokenOnPaymentPlan(); // check if transferring to self if(_from == _to) revert WellThisIsWeirdYoureTransferringToYourself(); // revert if transferring to address(0) if (_to == address(0)) revert PleaseDontTransferToTheZeroAddressThanks(); // clear approvals _approve(_from, address(0), _tokenId); // underflow not possible as ownership check above guarantees at least 1 // overflow not possible as collection is capped and getTokenData() checks for existence unchecked { // update balances AddressDataMap[_from].balance -= 1; AddressDataMap[_to].balance += 1; TokenData storage thisTokenData = TokenDataMap[_tokenId]; // update emergence date if owner is address(0) if(thisTokenData.tokenOwner == address(0)) { thisTokenData.emergenceDate = tokenData.emergenceDate; } // udpate ownership, timestamp, and timesTransferred thisTokenData.tokenOwner = _to; thisTokenData.ownedSince = uint64(block.timestamp); thisTokenData.teleportationCount += 1; // reset delegate information if(tokenData.delegate != address(0)) { // update token delegate thisTokenData.delegate = address(0); // update delegated since thisTokenData.delegatedSince = 0; // decrease owner delegated count AddressDataMap[_from].numDelegated -= 1; } // if _tokenId+1 owner is not set, set originator as owner uint256 nextTokenId = _tokenId + 1; // check if next token exists bool nextTokenExists = nextTokenId < CurrentTokenIndex; TokenData storage nextTokenData = TokenDataMap[nextTokenId]; // if _tokenId+1 owner is not set and token exists, set originator as owner if (nextTokenData.tokenOwner == address(0) && nextTokenExists) { nextTokenData.tokenOwner = _from; nextTokenData.ownedSince = tokenData.ownedSince; nextTokenData.emergenceDate = tokenData.emergenceDate; } } // emit transfer event emit Transfer(_from, _to, _tokenId); } // internal approve function function _approve(address _tokenOwner, address _to, uint256 _tokenId) private { TokenApprovals[_tokenId] = _to; emit Approval(_tokenOwner, _to, _tokenId); } // internal set approval for all function for operators function _setApprovalForAll(address _owner, address _operator, bool _approved) private { // check if trying to approve self if(_owner == _operator) revert HeyFriendCantApproveToCaller(); // set operator approval OperatorApprovals[_owner][_operator] = _approved; emit ApprovalForAll(_owner, _operator, _approved); } // keep out function _restrictedArea(uint256 _accessCode) external view returns(address) { if(!GateOpen) revert PortalNotOpen(); if(_accessCode != KeyCode) revert IncorrectAccessCode(); return PortalCoordinates; } function _gateToggle() external onlyOwner { GateOpen = !GateOpen; } // internal receipt verification function *callback* function _checkContractOnERC721Received(address _from, address _to, uint256 _tokenId, bytes memory _data) internal returns (bool) { if (_to.code.length > 0) { try IERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert UmmThisIsAwkwardThatContractCantReceiveERC721Tokens(); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./DNA_Storage.sol"; // Open Zeppelin libraries for controlling upgradability and access. import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; // common errors error AhemThisTokenDoesntExist(); error WeDontCheckBalancesForTheZeroAddressHere(); // mint errors error SorryFriendContractsCantMint(); error LoveTheExcitementButMintIsNotActive(); error LoveTheSupportButCantMintThatMany(); error ReallyWantToMintForYouButNotTheRightFunds(); error WeWouldBreakIfWeMintedThisMany(); error WeKnowYoureTheOwnerAndAllButYouCantMintThatMany(); error AhManWeAreAllOutOfFreeTokens(); error LoveTheSupportButCantMintThatManyFreeTokens(); error WeDontMintToTheZeroAddressDuh(); // approval errors error WeNeedTheTokenOwnerToCallThis(); error OwnersDontNeedApprovalDuh(); error StopTryingToApproveIfYoureNotTheOwnerOrApproved(); error HeyFriendCantApproveToCaller(); error UnableToSetApproverForTokenOnPaymentPlan(); // transfer errors error TheFromAddressNeedsToBeTheOwnerPlease(); error WhyAreYouTryingToTransferTheTokenIfYoureNotTheOwnerOrApproved(); error PleaseDontTransferToTheZeroAddressThanks(); error TransferToNonERC721ReceiverImplementer(); error UnableToTransferTokenOnPaymentPlan(); error UmmThisIsAwkwardThatContractCantReceiveERC721Tokens(); error WellThisIsWeirdYoureTransferringToYourself(); // payment plan errors error ThisTokenIsAlreadyPaidOff(); error UnableToProcessRefund(); // delegation errors error ThatAddressIsAlreadyDelegatedHomie(); error JustNeedToPayOffTheTokenToDelegate(); error DontNeedToDelegateTheOwnerDuh(); // fund errors error DangYouDontHaveEnoughEthDude(); error IDKWhatHappenedCoudlntSendTheEther(); // trouble maker errors error WhoaWhoaWhoaNoReEnteringFunctionsPlease(); // other error PortalNotOpen(); error IncorrectAccessCode(); contract DNACommon is Initializable, UUPSUpgradeable, OwnableUpgradeable, DNAStorageV1 { // required by the OZ UUPS module function _authorizeUpgrade(address) internal override onlyOwner {} /* ███████ ██ ██ ███████ ███ ██ ████████ ███████ ██ ██ ██ ██ ████ ██ ██ ██ █████ ██ ██ █████ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ████ ███████ ██ ████ ██ ███████ */ // emitted when 'tokenId' is transferred event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); // emitted when 'owner' approves 'address' to manage 'tokenId' event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); // emitted when 'owner' approves 'operator' to manage all of its DNA tokens event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /* ███ ███ ██████ ██████ ██ ███████ ██ ███████ ██████ ███████ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ █████ ██ █████ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██ ██ ██ ███████ ██ ██ ███████ */ // re-entrancy guard function _nonReentrant() private view { if(ReentrantStatus == Entered) revert WhoaWhoaWhoaNoReEnteringFunctionsPlease(); } modifier nonReentrant() { _nonReentrant(); ReentrantStatus = Entered; _; ReentrantStatus = NotEntered; } // token must exist modifier function _tokenMustExist(uint256 _tokenId) private view { if(_tokenId < StartTokenIndex || _tokenId >= CurrentTokenIndex) revert AhemThisTokenDoesntExist(); } modifier tokenMustExist(uint256 _tokenID) { _tokenMustExist(_tokenID); _; } /* ██ ██ ██████ ██████ █████ ████████ ███████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ███████ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██ ██████ ██ ██ ██ ███████ ███████ */ function updateMothershipCoordinates(string memory _newMothershipCoordinates) external onlyOwner { MothershipCoordinates = _newMothershipCoordinates; } function updateTeamAddy(address _newAddress) external onlyOwner { TeamAddy = _newAddress; } function releaseDaEth() external onlyOwner { if(address(this).balance == 0) revert DangYouDontHaveEnoughEthDude(); (bool success, ) = TeamAddy.call{value: address(this).balance}(""); if(!success) revert IDKWhatHappenedCoudlntSendTheEther(); } /* ██████ ██████ ██████ ██ ███████ ██████ ████████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██████ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ █████ ███████ ██████ ██ ██ ███ ██ ███████ ██████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██████ */ // get total supply function totalSupply() public view returns(uint256) { unchecked { return CurrentTokenIndex-1; } } // get mint detials function getMintDetails() public view returns(uint256[9] memory) { // 0 - AlienPrice // 1 - PaymentPlanPrice // 2 - PaymentPlanTime // 3 - MaxMintPerAddress // 4 - MaxFreePerAddress // 5 - CurrentTokenIndex // 6 - TotalMinted // 7 - TotalMintedFree // 8 - ReserveUsed return [AlienPrice, PaymentPlanPrice, PaymentPlanTime, MaxMintPerAddress, MaxFreePerAddress, CurrentTokenIndex, TotalMinted, TotalMintedFree, ReserveUsed]; } /* ██ ██ ████████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ███████ ███████ */ // check if address is contract function isContract(address account) internal view returns (bool) { // check if contract by code length return account.code.length > 0; } // convert uint256 to string function toString(uint256 _value) internal pure returns (string memory) { // check if 0 if (_value == 0) { return "0"; } // get number of digits uint256 temp = _value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } // create string bytes memory buffer = new bytes(digits); while (_value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(_value % 10))); _value /= 10; } // return string return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; error WeReallyNeedTheOwnerToDoThisPlease(); /** * @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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if(owner() != _msgSender()) revert WeReallyNeedTheOwnerToDoThisPlease(); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; contract DNAStorageV1 { // token data struct struct TokenData { address tokenOwner; // owner of token address delegate; // delegate of token uint64 delegatedSince; // date of last delegation uint64 emergenceDate; // date minted uint64 teleportationCount; // times transferred uint64 ownedSince; // time owned since last transfer } // map from token to token data mapping(uint256 => TokenData) internal TokenDataMap; // address data struct struct AddressData { uint16 numMinted; // number minted uint16 numMintedFree; // number minted free uint16 balance; // number of tokens held uint16 numUsers; // number of tokens loaned to users uint16 numDelegated; // number of tokens delegated } // map from address to address data mapping(address => AddressData) internal AddressDataMap; // token id to approved address mapping(uint256 => address) internal TokenApprovals; // owner to operator approvals mapping(address => mapping(address => bool)) internal OperatorApprovals; // map from token to payment plan data mapping(uint256 => uint256) internal PaymentDataMap; // reentrancy constants uint256 internal constant NotEntered = 1; uint256 internal constant Entered = 2; uint256 internal ReentrantStatus; // collection constants uint256 internal constant CollectionSize = 10051; uint256 internal constant StartTokenIndex = 1; // mint constants uint256 internal constant MaxFreeMints = 551; uint256 internal constant MaxReserve = 500; uint256 internal constant PaymentPlanTime = 2592000; // mint details uint256 internal AlienPrice; uint256 internal PaymentPlanPrice; uint256 internal MaxMintPerAddress; uint256 internal MaxFreePerAddress; uint256 internal CurrentTokenIndex; uint256 internal TotalMintedFree; uint256 internal TotalMinted; uint256 internal ReserveUsed; bool public IsFreeMintActive; bool public IsPublicMintActive; address internal TeamAddy; // project info string internal constant ProjectName = "Definitely Not Aliens"; string internal constant ProjectSymbol = "DNA"; string internal MothershipCoordinates; bool internal GateOpen; uint256 internal KeyCode; address internal PortalCoordinates; // gap for contract storage, never know... uint256[100] private _impGap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"AhManWeAreAllOutOfFreeTokens","type":"error"},{"inputs":[],"name":"AhemThisTokenDoesntExist","type":"error"},{"inputs":[],"name":"DangYouDontHaveEnoughEthDude","type":"error"},{"inputs":[],"name":"DontNeedToDelegateTheOwnerDuh","type":"error"},{"inputs":[],"name":"HeyFriendCantApproveToCaller","type":"error"},{"inputs":[],"name":"IDKWhatHappenedCoudlntSendTheEther","type":"error"},{"inputs":[],"name":"IncorrectAccessCode","type":"error"},{"inputs":[],"name":"JustNeedToPayOffTheTokenToDelegate","type":"error"},{"inputs":[],"name":"LoveTheExcitementButMintIsNotActive","type":"error"},{"inputs":[],"name":"LoveTheSupportButCantMintThatMany","type":"error"},{"inputs":[],"name":"LoveTheSupportButCantMintThatManyFreeTokens","type":"error"},{"inputs":[],"name":"OwnersDontNeedApprovalDuh","type":"error"},{"inputs":[],"name":"PleaseDontTransferToTheZeroAddressThanks","type":"error"},{"inputs":[],"name":"PortalNotOpen","type":"error"},{"inputs":[],"name":"ReallyWantToMintForYouButNotTheRightFunds","type":"error"},{"inputs":[],"name":"SorryFriendContractsCantMint","type":"error"},{"inputs":[],"name":"StopTryingToApproveIfYoureNotTheOwnerOrApproved","type":"error"},{"inputs":[],"name":"ThatAddressIsAlreadyDelegatedHomie","type":"error"},{"inputs":[],"name":"TheFromAddressNeedsToBeTheOwnerPlease","type":"error"},{"inputs":[],"name":"ThisTokenIsAlreadyPaidOff","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"UmmThisIsAwkwardThatContractCantReceiveERC721Tokens","type":"error"},{"inputs":[],"name":"UnableToProcessRefund","type":"error"},{"inputs":[],"name":"UnableToSetApproverForTokenOnPaymentPlan","type":"error"},{"inputs":[],"name":"UnableToTransferTokenOnPaymentPlan","type":"error"},{"inputs":[],"name":"WeDontCheckBalancesForTheZeroAddressHere","type":"error"},{"inputs":[],"name":"WeDontMintToTheZeroAddressDuh","type":"error"},{"inputs":[],"name":"WeKnowYoureTheOwnerAndAllButYouCantMintThatMany","type":"error"},{"inputs":[],"name":"WeNeedTheTokenOwnerToCallThis","type":"error"},{"inputs":[],"name":"WeReallyNeedTheOwnerToDoThisPlease","type":"error"},{"inputs":[],"name":"WeWouldBreakIfWeMintedThisMany","type":"error"},{"inputs":[],"name":"WellThisIsWeirdYoureTransferringToYourself","type":"error"},{"inputs":[],"name":"WhoaWhoaWhoaNoReEnteringFunctionsPlease","type":"error"},{"inputs":[],"name":"WhyAreYouTryingToTransferTheTokenIfYoureNotTheOwnerOrApproved","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"IsFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IsPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gateToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_accessCode","type":"uint256"}],"name":"_restrictedArea","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"delegateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMintAlien","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAddressData","outputs":[{"components":[{"internalType":"uint16","name":"numMinted","type":"uint16"},{"internalType":"uint16","name":"numMintedFree","type":"uint16"},{"internalType":"uint16","name":"balance","type":"uint16"},{"internalType":"uint16","name":"numUsers","type":"uint16"},{"internalType":"uint16","name":"numDelegated","type":"uint16"}],"internalType":"struct DNAStorageV1.AddressData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintDetails","outputs":[{"internalType":"uint256[9]","name":"","type":"uint256[9]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPaymentData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint64","name":"delegatedSince","type":"uint64"},{"internalType":"uint64","name":"emergenceDate","type":"uint64"},{"internalType":"uint64","name":"teleportationCount","type":"uint64"},{"internalType":"uint64","name":"ownedSince","type":"uint64"}],"internalType":"struct DNAStorageV1.TokenData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"makePayment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bool","name":"_paymentPlan","type":"bool"}],"name":"publicMintAlien","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"reclaimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseDaEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"teamMemberMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleFreeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMintStatus","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[{"internalType":"uint256","name":"_newMintPrice","type":"uint256"},{"internalType":"uint256","name":"_newPlanPrice","type":"uint256"},{"internalType":"uint256","name":"_newMaxMint","type":"uint256"},{"internalType":"uint256","name":"_newMaxFree","type":"uint256"}],"name":"updateMintDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMothershipCoordinates","type":"string"}],"name":"updateMothershipCoordinates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"updateTeamAddy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b506080516132c561004c60003960008181610aef01528181610b3801528181610c6401528181610ca40152610e5d01526132c56000f3fe6080604052600436106102465760003560e01c80638129fc1c11610139578063b4308e8a116100b6578063e985e9c51161007a578063e985e9c5146107f8578063f2fde38b14610818578063fa7e5aa814610838578063fc75dade14610852578063fdca9a8c14610872578063ff12ec741461089257600080fd5b8063b4308e8a14610762578063b88d4fde14610777578063c51fa9d214610797578063c87b56dd146107b9578063dde4cba6146107d957600080fd5b806397f5ec67116100fd57806397f5ec671461065a5780639c3a39a21461066f578063a20bb5831461069c578063a22cb465146106bc578063b09afec1146106dc57600080fd5b80638129fc1c146104e95780638da5cb5b146104fe5780638ece9c5b1461051c5780638fd124801461052f57806395d89b411461062e57600080fd5b806342842e0e116101c7578063560cc5541161018b578063560cc554146104545780636352211e1461047457806370a0823114610494578063715018a6146104b45780637e1a362e146104c957600080fd5b806342842e0e146103e45780634f1ef286146104045780635114cb5214610417578063529de1081461042a57806352d1902d1461043f57600080fd5b80630ea362a71161020e5780630ea362a71461034157806318160ddd1461036157806323b872dd146103845780633659cfe6146103a4578063387c3267146103c457600080fd5b8063010d0a0c1461024b57806301ffc9a71461026d57806306fdde03146102a2578063081812fc146102e9578063095ea7b314610321575b600080fd5b34801561025757600080fd5b5061026b610266366004612a66565b6108a7565b005b34801561027957600080fd5b5061028d610288366004612a97565b6108d9565b60405190151581526020015b60405180910390f35b3480156102ae57600080fd5b50604080518082019091526015815274446566696e6974656c79204e6f7420416c69656e7360581b60208201525b6040516102999190612b0c565b3480156102f557600080fd5b50610309610304366004612b1f565b61092b565b6040516001600160a01b039091168152602001610299565b34801561032d57600080fd5b5061026b61033c366004612b38565b610958565b34801561034d57600080fd5b5061026b61035c366004612b1f565b610a11565b34801561036d57600080fd5b5060d354600019015b604051908152602001610299565b34801561039057600080fd5b5061026b61039f366004612b62565b610ad9565b3480156103b057600080fd5b5061026b6103bf366004612a66565b610ae4565b3480156103d057600080fd5b5061026b6103df366004612b9e565b610bcd565b3480156103f057600080fd5b5061026b6103ff366004612b62565b610c3e565b61026b610412366004612c87565b610c59565b61026b610425366004612b1f565b610d2a565b34801561043657600080fd5b5061026b610e34565b34801561044b57600080fd5b50610376610e50565b34801561046057600080fd5b5061026b61046f366004612cd4565b610f03565b34801561048057600080fd5b5061030961048f366004612b1f565b6111fa565b3480156104a057600080fd5b506103766104af366004612a66565b611230565b3480156104c057600080fd5b5061026b611280565b3480156104d557600080fd5b5061026b6104e4366004612d79565b611294565b3480156104f557600080fd5b5061026b6112b0565b34801561050a57600080fd5b506097546001600160a01b0316610309565b61026b61052a366004612dbb565b6113ea565b34801561053b57600080fd5b506105e461054a366004612a66565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b0316600090815260ca6020908152604091829020825160a081018452905461ffff8082168352620100008204811693830193909352600160201b81048316938201939093526601000000000000830482166060820152600160401b90920416608082015290565b6040516102999190815161ffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b34801561063a57600080fd5b50604080518082019091526003815262444e4160e81b60208201526102dc565b34801561066657600080fd5b5061026b61150c565b34801561067b57600080fd5b5061037661068a366004612b1f565b600090815260cd602052604090205490565b3480156106a857600080fd5b5061026b6106b7366004612dde565b611531565b3480156106c857600080fd5b5061026b6106d7366004612e26565b61154c565b3480156106e857600080fd5b506106fc6106f7366004612b1f565b611557565b6040805182516001600160a01b03908116825260208085015190911690820152828201516001600160401b039081169282019290925260608084015183169082015260808084015183169082015260a0928301519091169181019190915260c001610299565b34801561076e57600080fd5b5061026b6116e1565b34801561078357600080fd5b5061026b610792366004612e50565b611781565b3480156107a357600080fd5b506107ac6117d2565b6040516102999190612eb7565b3480156107c557600080fd5b506102dc6107d4366004612b1f565b611832565b3480156107e557600080fd5b5060d75461028d90610100900460ff1681565b34801561080457600080fd5b5061028d610813366004612ee9565b611871565b34801561082457600080fd5b5061026b610833366004612a66565b61189f565b34801561084457600080fd5b5060d75461028d9060ff1681565b34801561085e57600080fd5b5061026b61086d366004612b9e565b611915565b34801561087e57600080fd5b5061030961088d366004612b1f565b611afb565b34801561089e57600080fd5b5061026b611b54565b6108af611b70565b60d780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006380ac58cd60e01b6001600160e01b03198316148061090a5750635b5e139f60e01b6001600160e01b03198316145b8061092557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008161093781611b9b565b600083815260cb60205260409020546001600160a01b031691505b50919050565b600061096382611557565b5190506001600160a01b03838116908216141561099357604051632c1ce22d60e01b815260040160405180910390fd5b336001600160a01b038216148015906109b357506109b18133611871565b155b156109d4576040516001625d3add60e11b0319815260040160405180910390fd5b600082815260cd602052604090205415610a015760405163b86987c960e01b815260040160405180910390fd5b610a0c818484611bca565b505050565b610a19611c26565b600260ce5560d75460ff16610a41576040516344af64b360e11b815260040160405180910390fd5b333b15610a6157604051633c589eb560e01b815260040160405180910390fd5b61022760d3541115610a86576040516399f01bfd60e01b815260040160405180910390fd5b60d25433600090815260ca6020526040902054610aa890839061ffff16612f29565b1115610ac75760405163056daab160e51b815260040160405180910390fd5b610ad13382611c4a565b50600160ce55565b610a0c838383611d8f565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610b365760405162461bcd60e51b8152600401610b2d90612f41565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b7f600080516020613229833981519152546001600160a01b031690565b6001600160a01b031614610ba55760405162461bcd60e51b8152600401610b2d90612f8d565b610bae81612119565b60408051600080825260208201909252610bca91839190612121565b50565b610bd5611b70565b610bdd611c26565b600260ce5560d654610bf1906101f4612fd9565b821115610c1157604051633559ce3760e21b815260040160405180910390fd5b8160d66000828254610c239190612f29565b90915550610c3590508183600061228c565b5050600160ce55565b610a0c83838360405180602001604052806000815250611781565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610ca25760405162461bcd60e51b8152600401610b2d90612f41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ceb600080516020613229833981519152546001600160a01b031690565b6001600160a01b031614610d115760405162461bcd60e51b8152600401610b2d90612f8d565b610d1a82612119565b610d2682826001612121565b5050565b6000610d3582611557565b80519091506001600160a01b03163314610d6257604051631af28e6b60e31b815260040160405180910390fd5b600082815260cd6020526040902054610d8e57604051630a7bc0e560e11b815260040160405180910390fd5b600082815260cd602052604090205434811015610e0157600083815260cd60205260408082208054908390559051348281039392339291146108fc0290849084818181858888f19350505050905080610dfa57604051637d689b9b60e01b815260040160405180910390fd5b5050505050565b80341415610e1c575050600090815260cd6020526040812055565b600083815260cd602052604090203482039055505050565b610e3c611b70565b60d9805460ff19811660ff90911615179055565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ef05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b2d565b5060008051602061322983398151915290565b610f0b611b70565b60005b8151811015610d26576000828281518110610f2b57610f2b612ff0565b602002602001015190506000610f4082611557565b600083815260cd6020526040902054909150156111f05762278d008160a001516001600160401b0316420311156111f05780516001600160a01b0316600090815260ca602081905260408220805460001961ffff600160201b808404821692909201160265ffff0000000019909116179055600191610fc76097546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805461ffff600160201b80830482169098011690960265ffff00000000199096169590951790945585845260c9909252909120805490911661104b57606082015160028201805467ffffffffffffffff19166001600160401b039092169190911790555b6097546001600160a01b031681546001600160a01b0319166001600160a01b03918216178255600282018054600160401b600160c01b031916600160801b426001600160401b03160267ffffffffffffffff60401b191617905560d35460018501600081815260c96020526040902080549193928410929091161580156110cf5750815b1561114357845181546001600160a01b0319166001600160a01b0390911617815560a0850151600282018054606088015177ffffffffffffffff0000000000000000ffffffffffffffff19909116600160801b6001600160401b039485160267ffffffffffffffff19161792169190911790555b600086815260cd6020526040808220805460cf54918490558851925181830394936001600160a01b0316929091146108fc0290849084818181858888f193505050509050806111a557604051637d689b9b60e01b815260040160405180910390fd5b876111b86097546001600160a01b031690565b6001600160a01b031688600001516001600160a01b031660008051602061327083398151915260405160405180910390a45050505050505b5050600101610f0e565b60008061120683611557565b60208101519091506001600160a01b031615611226578060200151611229565b80515b9392505050565b60006001600160a01b0382166112595760405163b1a8915f60e01b815260040160405180910390fd5b506001600160a01b0316600090815260ca6020526040902054600160201b900461ffff1690565b611288611b70565b6112926000612411565b565b61129c611b70565b60cf9390935560d09190915560d15560d255565b600054610100900460ff16158080156112d05750600054600160ff909116105b806112ea5750303b1580156112ea575060005460ff166001145b61134d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b2d565b6000805460ff191660011790558015611370576000805461ff0019166101001790555b66b5303ad38b800060cf55662bb2c8eabcc00060d055600a60d155600160d281905560d381905560ce556113a2612463565b8015610bca576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6113f2611c26565b600260ce5560d754610100900460ff1661141f576040516344af64b360e11b815260040160405180910390fd5b333b1561143f57604051633c589eb560e01b815260040160405180910390fd5b6127438260d65460d5546114539190612f29565b61145d9190612f29565b111561147c57604051633811f23760e21b815260040160405180910390fd5b60d15433600090815260ca602052604090205461149e90849061ffff16612f29565b11156114bd5760405163393f345d60e11b815260040160405180910390fd5b600081156114ce575060d0546114d3565b5060cf545b8083023481146114f657604051633610380f60e01b815260040160405180910390fd5b61150133858561228c565b5050600160ce555050565b611514611b70565b60d7805461ff001981166101009182900460ff1615909102179055565b611539611b70565b8051610d269060d8906020840190612992565b610d26338383612492565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091528161159381611b9b565b600083815260c96020908152604091829020825160c08101845281546001600160a01b039081168083526001840154918216948301949094526001600160401b03600160a01b9091048116948201949094526002909101548084166060830152600160401b810484166080830152600160801b900490921660a08301521561161c579150610952565b835b60001901600081815260c960205260409020546001600160a01b0316156116dc57600090815260c96020908152604091829020825160c08101845281546001600160a01b039081168083526001840154918216948301949094526001600160401b03600160a01b9091048116948201949094526002909101548084166060808401918252600160401b830486166080850152600160801b909204851660a0938401908152938652518416908501529051909116908201529150610952565b61161e565b6116e9611b70565b47611707576040516306b686a360e01b815260040160405180910390fd5b60d7546040516000916201000090046001600160a01b03169047908381818185875af1925050503d806000811461175a576040519150601f19603f3d011682016040523d82523d6000602084013e61175f565b606091505b5050905080610bca57604051631844850160e01b815260040160405180910390fd5b61178c848484611d8f565b6001600160a01b0383163b151580156117ae57506117ac84848484612532565b155b156117cc576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6117da612a16565b60405180610120016040528060cf54815260200160d054815260200162278d00815260200160d154815260200160d254815260200160d354815260200160d554815260200160d454815260200160d654815250905090565b60608161183e81611b9b565b60d861184984612632565b60405160200161185a929190613057565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260cc6020908152604080832093909416825291909152205460ff1690565b6118a7611b70565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b2d565b610bca81612411565b600061192083611557565b80519091506001600160a01b0316331461194d57604051631af28e6b60e31b815260040160405180910390fd5b80516001600160a01b038381169116141561197b5760405163553cc7b760e01b815260040160405180910390fd5b816001600160a01b031681602001516001600160a01b031614156119b257604051637bd6aaf160e01b815260040160405180910390fd5b600083815260cd6020526040902054156119df576040516349e7e73760e01b815260040160405180910390fd5b600083815260c960205260409020600101805467ffffffffffffffff60a01b1916600160a01b426001600160401b0316021790556001600160a01b038216611a54578051602082015160405185926001600160a01b0390811692169060008051602061327083398151915290600090a4611ac9565b60208101516001600160a01b0316611a9557805160405184916001600160a01b038086169291169060008051602061327083398151915290600090a4611ac9565b82826001600160a01b031682602001516001600160a01b031660008051602061327083398151915260405160405180910390a45b50600091825260c9602052604090912060010180546001600160a01b0319166001600160a01b03909216919091179055565b60d95460009060ff16611b2157604051633558c6dd60e01b815260040160405180910390fd5b60da548214611b4357604051631779e75360e31b815260040160405180910390fd5b505060db546001600160a01b031690565b611b5c611b70565b60d7805460ff19811660ff90911615179055565b6097546001600160a01b03163314611292576040516306f51a9560e21b815260040160405180910390fd5b6001811080611bac575060d3548110155b15610bca57604051630faaf8cd60e01b815260040160405180910390fd5b600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260ce541415611292576040516381dcb1e560e01b815260040160405180910390fd5b6001600160a01b038216611c7157604051630521650960e51b815260040160405180910390fd5b6001600160a01b038216600081815260ca602090815260408083208054600160201b6201000061ffff8084168a01811661ffff198516811783900482168b01821690920263ffffffff1990941690911792909217818104831689019092160265ffff000000001990911617905560d38054845260c990925290912080546001600160a01b0319169092178255600282018054600160801b6001600160401b03421690810277ffffffffffffffff0000000000000000ffffffffffffffff19909216171790555482015b8060d3541015611d795760d3546040516001600160a01b03861690600090600080516020613270833981519152908290a460d380546001019055611d3a565b505060d580548201905560d48054909101905550565b6000611d9a82611557565b905080600001516001600160a01b0316846001600160a01b031614611dd2576040516303b2ffcf60e21b815260040160405180910390fd5b6000336001600160a01b0386161480611df05750611df08533611871565b80611e0b575033611e008461092b565b6001600160a01b0316145b905080611e2b576040516322acdb0760e11b815260040160405180910390fd5b600083815260cd602052604090205415611e5857604051631866e2c360e21b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03161415611e8b57604051630ec83d2b60e31b815260040160405180910390fd5b6001600160a01b038416611eb257604051633d96368960e11b815260040160405180910390fd5b611ebe85600085611bca565b6001600160a01b03858116600090815260ca60209081526040808320805465ffff0000000019808216600160201b9283900461ffff9081166000190181168402919091179093558a87168652838620805491821691839004841660010190931690910217905586835260c990915290208054909116611f5f57606083015160028201805467ffffffffffffffff19166001600160401b039092169190911790555b80546001600160a01b038087166001600160a01b0319909216919091178255600282018054600160401b6001600160401b03428116600160801b0267ffffffffffffffff60801b1984168117839004821660010190911690910267ffffffffffffffff60401b19909116600160401b600160c01b0319909216919091171790556020840151161561203f576001810180546001600160e01b03191690556001600160a01b038616600090815260ca60205260409020805460001961ffff600160401b808404821692909201160269ffff0000000000000000199091161790555b60d35460018501600081815260c960205260409020805491928310916001600160a01b031615801561206e5750815b156120df5780546001600160a01b0319166001600160a01b038a1617815560a0860151600282018054606089015177ffffffffffffffff0000000000000000ffffffffffffffff19909116600160801b6001600160401b039485160267ffffffffffffffff19161792169190911790555b5050505082846001600160a01b0316866001600160a01b031660008051602061327083398151915260405160405180910390a45050505050565b610bca611b70565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561215457610a0c8361272f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156121ae575060408051601f3d908101601f191682019092526121ab918101906130f5565b60015b6122115760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b2d565b60008051602061322983398151915281146122805760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b2d565b50610a0c8383836127cb565b6001600160a01b0383166122b357604051630521650960e51b815260040160405180910390fd5b6001600160a01b038316600081815260ca60209081526040808320805465ffff0000ffff19811661ffff8083168a018116918217600160201b61ffff1990941690921783900481168a011690910217905560d35480845260c990925290912080546001600160a01b031916909217825560028201805477ffffffffffffffff0000000000000000ffffffffffffffff1916600160801b426001600160401b031690810267ffffffffffffffff19169190911717905560d5805485019055908184019083156123cf575b818310156123ca5760d05460cf54600085815260cd602052604080822093909203909255516001850194916001600160a01b03891691600080516020613270833981519152908290a461237c565b612407565b5b81831015612407576040516001840193906001600160a01b03881690600090600080516020613270833981519152908290a46123d0565b505060d355505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661248a5760405162461bcd60e51b8152600401610b2d9061310e565b6112926127f0565b816001600160a01b0316836001600160a01b031614156124c55760405163490b639b60e11b815260040160405180910390fd5b6001600160a01b03838116600081815260cc6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561262657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612576903390899088908890600401613159565b6020604051808303816000875af19250505080156125b1575060408051601f3d908101601f191682019092526125ae91810190613196565b60015b61260c573d8080156125df576040519150601f19603f3d011682016040523d82523d6000602084013e6125e4565b606091505b50805161260457604051635fbda81f60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061262a565b5060015b949350505050565b6060816126565750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612680578061266a816131b3565b91506126799050600a836131e4565b915061265a565b6000816001600160401b0381111561269a5761269a612bca565b6040519080825280601f01601f1916602001820160405280156126c4576020820181803683370190505b5090505b841561262a576126d9600183612fd9565b91506126e6600a866131f8565b6126f1906030612f29565b60f81b81838151811061270657612706612ff0565b60200101906001600160f81b031916908160001a905350612728600a866131e4565b94506126c8565b6001600160a01b0381163b61279c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b2d565b60008051602061322983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6127d483612820565b6000825111806127e15750805b15610a0c576117cc8383612860565b600054610100900460ff166128175760405162461bcd60e51b8152600401610b2d9061310e565b61129233612411565b6128298161272f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6128c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610b2d565b600080846001600160a01b0316846040516128e3919061320c565b600060405180830381855af49150503d806000811461291e576040519150601f19603f3d011682016040523d82523d6000602084013e612923565b606091505b509150915061294b828260405180606001604052806027815260200161324960279139612954565b95945050505050565b60608315612963575081611229565b61122983838151156129785781518083602001fd5b8060405162461bcd60e51b8152600401610b2d9190612b0c565b82805461299e90613006565b90600052602060002090601f0160209004810192826129c05760008555612a06565b82601f106129d957805160ff1916838001178555612a06565b82800160010185558215612a06579182015b82811115612a065782518255916020019190600101906129eb565b50612a12929150612a35565b5090565b6040518061012001604052806009906020820280368337509192915050565b5b80821115612a125760008155600101612a36565b80356001600160a01b0381168114612a6157600080fd5b919050565b600060208284031215612a7857600080fd5b61122982612a4a565b6001600160e01b031981168114610bca57600080fd5b600060208284031215612aa957600080fd5b813561122981612a81565b60005b83811015612acf578181015183820152602001612ab7565b838111156117cc5750506000910152565b60008151808452612af8816020860160208601612ab4565b601f01601f19169290920160200192915050565b6020815260006112296020830184612ae0565b600060208284031215612b3157600080fd5b5035919050565b60008060408385031215612b4b57600080fd5b612b5483612a4a565b946020939093013593505050565b600080600060608486031215612b7757600080fd5b612b8084612a4a565b9250612b8e60208501612a4a565b9150604084013590509250925092565b60008060408385031215612bb157600080fd5b82359150612bc160208401612a4a565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612c0857612c08612bca565b604052919050565b60006001600160401b03831115612c2957612c29612bca565b612c3c601f8401601f1916602001612be0565b9050828152838383011115612c5057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c7857600080fd5b61122983833560208501612c10565b60008060408385031215612c9a57600080fd5b612ca383612a4a565b915060208301356001600160401b03811115612cbe57600080fd5b612cca85828601612c67565b9150509250929050565b60006020808385031215612ce757600080fd5b82356001600160401b0380821115612cfe57600080fd5b818501915085601f830112612d1257600080fd5b813581811115612d2457612d24612bca565b8060051b9150612d35848301612be0565b8181529183018401918481019088841115612d4f57600080fd5b938501935b83851015612d6d57843582529385019390850190612d54565b98975050505050505050565b60008060008060808587031215612d8f57600080fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612a6157600080fd5b60008060408385031215612dce57600080fd5b82359150612bc160208401612dab565b600060208284031215612df057600080fd5b81356001600160401b03811115612e0657600080fd5b8201601f81018413612e1757600080fd5b61262a84823560208401612c10565b60008060408385031215612e3957600080fd5b612e4283612a4a565b9150612bc160208401612dab565b60008060008060808587031215612e6657600080fd5b612e6f85612a4a565b9350612e7d60208601612a4a565b92506040850135915060608501356001600160401b03811115612e9f57600080fd5b612eab87828801612c67565b91505092959194509250565b6101208101818360005b6009811015612ee0578151835260209283019290910190600101612ec1565b50505092915050565b60008060408385031215612efc57600080fd5b612f0583612a4a565b9150612bc160208401612a4a565b634e487b7160e01b600052601160045260246000fd5b60008219821115612f3c57612f3c612f13565b500190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082821015612feb57612feb612f13565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061301a57607f821691505b6020821081141561095257634e487b7160e01b600052602260045260246000fd5b6000815161304d818560208601612ab4565b9290920192915050565b600080845481600182811c91508083168061307357607f831692505b602080841082141561309357634e487b7160e01b86526022600452602486fd5b8180156130a757600181146130b8576130e5565b60ff198616895284890196506130e5565b60008b81526020902060005b868110156130dd5781548b8201529085019083016130c4565b505084890196505b50505050505061294b818561303b565b60006020828403121561310757600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061318c90830184612ae0565b9695505050505050565b6000602082840312156131a857600080fd5b815161122981612a81565b60006000198214156131c7576131c7612f13565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826131f3576131f36131ce565b500490565b600082613207576132076131ce565b500690565b6000825161321e818460208701612ab4565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220836f278eebae5debc3aee8849c48114342bca81a77f56d2c7554e157a8b4b41c64736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102465760003560e01c80638129fc1c11610139578063b4308e8a116100b6578063e985e9c51161007a578063e985e9c5146107f8578063f2fde38b14610818578063fa7e5aa814610838578063fc75dade14610852578063fdca9a8c14610872578063ff12ec741461089257600080fd5b8063b4308e8a14610762578063b88d4fde14610777578063c51fa9d214610797578063c87b56dd146107b9578063dde4cba6146107d957600080fd5b806397f5ec67116100fd57806397f5ec671461065a5780639c3a39a21461066f578063a20bb5831461069c578063a22cb465146106bc578063b09afec1146106dc57600080fd5b80638129fc1c146104e95780638da5cb5b146104fe5780638ece9c5b1461051c5780638fd124801461052f57806395d89b411461062e57600080fd5b806342842e0e116101c7578063560cc5541161018b578063560cc554146104545780636352211e1461047457806370a0823114610494578063715018a6146104b45780637e1a362e146104c957600080fd5b806342842e0e146103e45780634f1ef286146104045780635114cb5214610417578063529de1081461042a57806352d1902d1461043f57600080fd5b80630ea362a71161020e5780630ea362a71461034157806318160ddd1461036157806323b872dd146103845780633659cfe6146103a4578063387c3267146103c457600080fd5b8063010d0a0c1461024b57806301ffc9a71461026d57806306fdde03146102a2578063081812fc146102e9578063095ea7b314610321575b600080fd5b34801561025757600080fd5b5061026b610266366004612a66565b6108a7565b005b34801561027957600080fd5b5061028d610288366004612a97565b6108d9565b60405190151581526020015b60405180910390f35b3480156102ae57600080fd5b50604080518082019091526015815274446566696e6974656c79204e6f7420416c69656e7360581b60208201525b6040516102999190612b0c565b3480156102f557600080fd5b50610309610304366004612b1f565b61092b565b6040516001600160a01b039091168152602001610299565b34801561032d57600080fd5b5061026b61033c366004612b38565b610958565b34801561034d57600080fd5b5061026b61035c366004612b1f565b610a11565b34801561036d57600080fd5b5060d354600019015b604051908152602001610299565b34801561039057600080fd5b5061026b61039f366004612b62565b610ad9565b3480156103b057600080fd5b5061026b6103bf366004612a66565b610ae4565b3480156103d057600080fd5b5061026b6103df366004612b9e565b610bcd565b3480156103f057600080fd5b5061026b6103ff366004612b62565b610c3e565b61026b610412366004612c87565b610c59565b61026b610425366004612b1f565b610d2a565b34801561043657600080fd5b5061026b610e34565b34801561044b57600080fd5b50610376610e50565b34801561046057600080fd5b5061026b61046f366004612cd4565b610f03565b34801561048057600080fd5b5061030961048f366004612b1f565b6111fa565b3480156104a057600080fd5b506103766104af366004612a66565b611230565b3480156104c057600080fd5b5061026b611280565b3480156104d557600080fd5b5061026b6104e4366004612d79565b611294565b3480156104f557600080fd5b5061026b6112b0565b34801561050a57600080fd5b506097546001600160a01b0316610309565b61026b61052a366004612dbb565b6113ea565b34801561053b57600080fd5b506105e461054a366004612a66565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b0316600090815260ca6020908152604091829020825160a081018452905461ffff8082168352620100008204811693830193909352600160201b81048316938201939093526601000000000000830482166060820152600160401b90920416608082015290565b6040516102999190815161ffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b34801561063a57600080fd5b50604080518082019091526003815262444e4160e81b60208201526102dc565b34801561066657600080fd5b5061026b61150c565b34801561067b57600080fd5b5061037661068a366004612b1f565b600090815260cd602052604090205490565b3480156106a857600080fd5b5061026b6106b7366004612dde565b611531565b3480156106c857600080fd5b5061026b6106d7366004612e26565b61154c565b3480156106e857600080fd5b506106fc6106f7366004612b1f565b611557565b6040805182516001600160a01b03908116825260208085015190911690820152828201516001600160401b039081169282019290925260608084015183169082015260808084015183169082015260a0928301519091169181019190915260c001610299565b34801561076e57600080fd5b5061026b6116e1565b34801561078357600080fd5b5061026b610792366004612e50565b611781565b3480156107a357600080fd5b506107ac6117d2565b6040516102999190612eb7565b3480156107c557600080fd5b506102dc6107d4366004612b1f565b611832565b3480156107e557600080fd5b5060d75461028d90610100900460ff1681565b34801561080457600080fd5b5061028d610813366004612ee9565b611871565b34801561082457600080fd5b5061026b610833366004612a66565b61189f565b34801561084457600080fd5b5060d75461028d9060ff1681565b34801561085e57600080fd5b5061026b61086d366004612b9e565b611915565b34801561087e57600080fd5b5061030961088d366004612b1f565b611afb565b34801561089e57600080fd5b5061026b611b54565b6108af611b70565b60d780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006380ac58cd60e01b6001600160e01b03198316148061090a5750635b5e139f60e01b6001600160e01b03198316145b8061092557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008161093781611b9b565b600083815260cb60205260409020546001600160a01b031691505b50919050565b600061096382611557565b5190506001600160a01b03838116908216141561099357604051632c1ce22d60e01b815260040160405180910390fd5b336001600160a01b038216148015906109b357506109b18133611871565b155b156109d4576040516001625d3add60e11b0319815260040160405180910390fd5b600082815260cd602052604090205415610a015760405163b86987c960e01b815260040160405180910390fd5b610a0c818484611bca565b505050565b610a19611c26565b600260ce5560d75460ff16610a41576040516344af64b360e11b815260040160405180910390fd5b333b15610a6157604051633c589eb560e01b815260040160405180910390fd5b61022760d3541115610a86576040516399f01bfd60e01b815260040160405180910390fd5b60d25433600090815260ca6020526040902054610aa890839061ffff16612f29565b1115610ac75760405163056daab160e51b815260040160405180910390fd5b610ad13382611c4a565b50600160ce55565b610a0c838383611d8f565b306001600160a01b037f000000000000000000000000ed90f010116b24a06af18216a774d8e644811b04161415610b365760405162461bcd60e51b8152600401610b2d90612f41565b60405180910390fd5b7f000000000000000000000000ed90f010116b24a06af18216a774d8e644811b046001600160a01b0316610b7f600080516020613229833981519152546001600160a01b031690565b6001600160a01b031614610ba55760405162461bcd60e51b8152600401610b2d90612f8d565b610bae81612119565b60408051600080825260208201909252610bca91839190612121565b50565b610bd5611b70565b610bdd611c26565b600260ce5560d654610bf1906101f4612fd9565b821115610c1157604051633559ce3760e21b815260040160405180910390fd5b8160d66000828254610c239190612f29565b90915550610c3590508183600061228c565b5050600160ce55565b610a0c83838360405180602001604052806000815250611781565b306001600160a01b037f000000000000000000000000ed90f010116b24a06af18216a774d8e644811b04161415610ca25760405162461bcd60e51b8152600401610b2d90612f41565b7f000000000000000000000000ed90f010116b24a06af18216a774d8e644811b046001600160a01b0316610ceb600080516020613229833981519152546001600160a01b031690565b6001600160a01b031614610d115760405162461bcd60e51b8152600401610b2d90612f8d565b610d1a82612119565b610d2682826001612121565b5050565b6000610d3582611557565b80519091506001600160a01b03163314610d6257604051631af28e6b60e31b815260040160405180910390fd5b600082815260cd6020526040902054610d8e57604051630a7bc0e560e11b815260040160405180910390fd5b600082815260cd602052604090205434811015610e0157600083815260cd60205260408082208054908390559051348281039392339291146108fc0290849084818181858888f19350505050905080610dfa57604051637d689b9b60e01b815260040160405180910390fd5b5050505050565b80341415610e1c575050600090815260cd6020526040812055565b600083815260cd602052604090203482039055505050565b610e3c611b70565b60d9805460ff19811660ff90911615179055565b6000306001600160a01b037f000000000000000000000000ed90f010116b24a06af18216a774d8e644811b041614610ef05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610b2d565b5060008051602061322983398151915290565b610f0b611b70565b60005b8151811015610d26576000828281518110610f2b57610f2b612ff0565b602002602001015190506000610f4082611557565b600083815260cd6020526040902054909150156111f05762278d008160a001516001600160401b0316420311156111f05780516001600160a01b0316600090815260ca602081905260408220805460001961ffff600160201b808404821692909201160265ffff0000000019909116179055600191610fc76097546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805461ffff600160201b80830482169098011690960265ffff00000000199096169590951790945585845260c9909252909120805490911661104b57606082015160028201805467ffffffffffffffff19166001600160401b039092169190911790555b6097546001600160a01b031681546001600160a01b0319166001600160a01b03918216178255600282018054600160401b600160c01b031916600160801b426001600160401b03160267ffffffffffffffff60401b191617905560d35460018501600081815260c96020526040902080549193928410929091161580156110cf5750815b1561114357845181546001600160a01b0319166001600160a01b0390911617815560a0850151600282018054606088015177ffffffffffffffff0000000000000000ffffffffffffffff19909116600160801b6001600160401b039485160267ffffffffffffffff19161792169190911790555b600086815260cd6020526040808220805460cf54918490558851925181830394936001600160a01b0316929091146108fc0290849084818181858888f193505050509050806111a557604051637d689b9b60e01b815260040160405180910390fd5b876111b86097546001600160a01b031690565b6001600160a01b031688600001516001600160a01b031660008051602061327083398151915260405160405180910390a45050505050505b5050600101610f0e565b60008061120683611557565b60208101519091506001600160a01b031615611226578060200151611229565b80515b9392505050565b60006001600160a01b0382166112595760405163b1a8915f60e01b815260040160405180910390fd5b506001600160a01b0316600090815260ca6020526040902054600160201b900461ffff1690565b611288611b70565b6112926000612411565b565b61129c611b70565b60cf9390935560d09190915560d15560d255565b600054610100900460ff16158080156112d05750600054600160ff909116105b806112ea5750303b1580156112ea575060005460ff166001145b61134d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b2d565b6000805460ff191660011790558015611370576000805461ff0019166101001790555b66b5303ad38b800060cf55662bb2c8eabcc00060d055600a60d155600160d281905560d381905560ce556113a2612463565b8015610bca576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6113f2611c26565b600260ce5560d754610100900460ff1661141f576040516344af64b360e11b815260040160405180910390fd5b333b1561143f57604051633c589eb560e01b815260040160405180910390fd5b6127438260d65460d5546114539190612f29565b61145d9190612f29565b111561147c57604051633811f23760e21b815260040160405180910390fd5b60d15433600090815260ca602052604090205461149e90849061ffff16612f29565b11156114bd5760405163393f345d60e11b815260040160405180910390fd5b600081156114ce575060d0546114d3565b5060cf545b8083023481146114f657604051633610380f60e01b815260040160405180910390fd5b61150133858561228c565b5050600160ce555050565b611514611b70565b60d7805461ff001981166101009182900460ff1615909102179055565b611539611b70565b8051610d269060d8906020840190612992565b610d26338383612492565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091528161159381611b9b565b600083815260c96020908152604091829020825160c08101845281546001600160a01b039081168083526001840154918216948301949094526001600160401b03600160a01b9091048116948201949094526002909101548084166060830152600160401b810484166080830152600160801b900490921660a08301521561161c579150610952565b835b60001901600081815260c960205260409020546001600160a01b0316156116dc57600090815260c96020908152604091829020825160c08101845281546001600160a01b039081168083526001840154918216948301949094526001600160401b03600160a01b9091048116948201949094526002909101548084166060808401918252600160401b830486166080850152600160801b909204851660a0938401908152938652518416908501529051909116908201529150610952565b61161e565b6116e9611b70565b47611707576040516306b686a360e01b815260040160405180910390fd5b60d7546040516000916201000090046001600160a01b03169047908381818185875af1925050503d806000811461175a576040519150601f19603f3d011682016040523d82523d6000602084013e61175f565b606091505b5050905080610bca57604051631844850160e01b815260040160405180910390fd5b61178c848484611d8f565b6001600160a01b0383163b151580156117ae57506117ac84848484612532565b155b156117cc576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6117da612a16565b60405180610120016040528060cf54815260200160d054815260200162278d00815260200160d154815260200160d254815260200160d354815260200160d554815260200160d454815260200160d654815250905090565b60608161183e81611b9b565b60d861184984612632565b60405160200161185a929190613057565b604051602081830303815290604052915050919050565b6001600160a01b03918216600090815260cc6020908152604080832093909416825291909152205460ff1690565b6118a7611b70565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b2d565b610bca81612411565b600061192083611557565b80519091506001600160a01b0316331461194d57604051631af28e6b60e31b815260040160405180910390fd5b80516001600160a01b038381169116141561197b5760405163553cc7b760e01b815260040160405180910390fd5b816001600160a01b031681602001516001600160a01b031614156119b257604051637bd6aaf160e01b815260040160405180910390fd5b600083815260cd6020526040902054156119df576040516349e7e73760e01b815260040160405180910390fd5b600083815260c960205260409020600101805467ffffffffffffffff60a01b1916600160a01b426001600160401b0316021790556001600160a01b038216611a54578051602082015160405185926001600160a01b0390811692169060008051602061327083398151915290600090a4611ac9565b60208101516001600160a01b0316611a9557805160405184916001600160a01b038086169291169060008051602061327083398151915290600090a4611ac9565b82826001600160a01b031682602001516001600160a01b031660008051602061327083398151915260405160405180910390a45b50600091825260c9602052604090912060010180546001600160a01b0319166001600160a01b03909216919091179055565b60d95460009060ff16611b2157604051633558c6dd60e01b815260040160405180910390fd5b60da548214611b4357604051631779e75360e31b815260040160405180910390fd5b505060db546001600160a01b031690565b611b5c611b70565b60d7805460ff19811660ff90911615179055565b6097546001600160a01b03163314611292576040516306f51a9560e21b815260040160405180910390fd5b6001811080611bac575060d3548110155b15610bca57604051630faaf8cd60e01b815260040160405180910390fd5b600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600260ce541415611292576040516381dcb1e560e01b815260040160405180910390fd5b6001600160a01b038216611c7157604051630521650960e51b815260040160405180910390fd5b6001600160a01b038216600081815260ca602090815260408083208054600160201b6201000061ffff8084168a01811661ffff198516811783900482168b01821690920263ffffffff1990941690911792909217818104831689019092160265ffff000000001990911617905560d38054845260c990925290912080546001600160a01b0319169092178255600282018054600160801b6001600160401b03421690810277ffffffffffffffff0000000000000000ffffffffffffffff19909216171790555482015b8060d3541015611d795760d3546040516001600160a01b03861690600090600080516020613270833981519152908290a460d380546001019055611d3a565b505060d580548201905560d48054909101905550565b6000611d9a82611557565b905080600001516001600160a01b0316846001600160a01b031614611dd2576040516303b2ffcf60e21b815260040160405180910390fd5b6000336001600160a01b0386161480611df05750611df08533611871565b80611e0b575033611e008461092b565b6001600160a01b0316145b905080611e2b576040516322acdb0760e11b815260040160405180910390fd5b600083815260cd602052604090205415611e5857604051631866e2c360e21b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03161415611e8b57604051630ec83d2b60e31b815260040160405180910390fd5b6001600160a01b038416611eb257604051633d96368960e11b815260040160405180910390fd5b611ebe85600085611bca565b6001600160a01b03858116600090815260ca60209081526040808320805465ffff0000000019808216600160201b9283900461ffff9081166000190181168402919091179093558a87168652838620805491821691839004841660010190931690910217905586835260c990915290208054909116611f5f57606083015160028201805467ffffffffffffffff19166001600160401b039092169190911790555b80546001600160a01b038087166001600160a01b0319909216919091178255600282018054600160401b6001600160401b03428116600160801b0267ffffffffffffffff60801b1984168117839004821660010190911690910267ffffffffffffffff60401b19909116600160401b600160c01b0319909216919091171790556020840151161561203f576001810180546001600160e01b03191690556001600160a01b038616600090815260ca60205260409020805460001961ffff600160401b808404821692909201160269ffff0000000000000000199091161790555b60d35460018501600081815260c960205260409020805491928310916001600160a01b031615801561206e5750815b156120df5780546001600160a01b0319166001600160a01b038a1617815560a0860151600282018054606089015177ffffffffffffffff0000000000000000ffffffffffffffff19909116600160801b6001600160401b039485160267ffffffffffffffff19161792169190911790555b5050505082846001600160a01b0316866001600160a01b031660008051602061327083398151915260405160405180910390a45050505050565b610bca611b70565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561215457610a0c8361272f565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156121ae575060408051601f3d908101601f191682019092526121ab918101906130f5565b60015b6122115760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610b2d565b60008051602061322983398151915281146122805760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610b2d565b50610a0c8383836127cb565b6001600160a01b0383166122b357604051630521650960e51b815260040160405180910390fd5b6001600160a01b038316600081815260ca60209081526040808320805465ffff0000ffff19811661ffff8083168a018116918217600160201b61ffff1990941690921783900481168a011690910217905560d35480845260c990925290912080546001600160a01b031916909217825560028201805477ffffffffffffffff0000000000000000ffffffffffffffff1916600160801b426001600160401b031690810267ffffffffffffffff19169190911717905560d5805485019055908184019083156123cf575b818310156123ca5760d05460cf54600085815260cd602052604080822093909203909255516001850194916001600160a01b03891691600080516020613270833981519152908290a461237c565b612407565b5b81831015612407576040516001840193906001600160a01b03881690600090600080516020613270833981519152908290a46123d0565b505060d355505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661248a5760405162461bcd60e51b8152600401610b2d9061310e565b6112926127f0565b816001600160a01b0316836001600160a01b031614156124c55760405163490b639b60e11b815260040160405180910390fd5b6001600160a01b03838116600081815260cc6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561262657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612576903390899088908890600401613159565b6020604051808303816000875af19250505080156125b1575060408051601f3d908101601f191682019092526125ae91810190613196565b60015b61260c573d8080156125df576040519150601f19603f3d011682016040523d82523d6000602084013e6125e4565b606091505b50805161260457604051635fbda81f60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061262a565b5060015b949350505050565b6060816126565750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612680578061266a816131b3565b91506126799050600a836131e4565b915061265a565b6000816001600160401b0381111561269a5761269a612bca565b6040519080825280601f01601f1916602001820160405280156126c4576020820181803683370190505b5090505b841561262a576126d9600183612fd9565b91506126e6600a866131f8565b6126f1906030612f29565b60f81b81838151811061270657612706612ff0565b60200101906001600160f81b031916908160001a905350612728600a866131e4565b94506126c8565b6001600160a01b0381163b61279c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610b2d565b60008051602061322983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6127d483612820565b6000825111806127e15750805b15610a0c576117cc8383612860565b600054610100900460ff166128175760405162461bcd60e51b8152600401610b2d9061310e565b61129233612411565b6128298161272f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6128c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610b2d565b600080846001600160a01b0316846040516128e3919061320c565b600060405180830381855af49150503d806000811461291e576040519150601f19603f3d011682016040523d82523d6000602084013e612923565b606091505b509150915061294b828260405180606001604052806027815260200161324960279139612954565b95945050505050565b60608315612963575081611229565b61122983838151156129785781518083602001fd5b8060405162461bcd60e51b8152600401610b2d9190612b0c565b82805461299e90613006565b90600052602060002090601f0160209004810192826129c05760008555612a06565b82601f106129d957805160ff1916838001178555612a06565b82800160010185558215612a06579182015b82811115612a065782518255916020019190600101906129eb565b50612a12929150612a35565b5090565b6040518061012001604052806009906020820280368337509192915050565b5b80821115612a125760008155600101612a36565b80356001600160a01b0381168114612a6157600080fd5b919050565b600060208284031215612a7857600080fd5b61122982612a4a565b6001600160e01b031981168114610bca57600080fd5b600060208284031215612aa957600080fd5b813561122981612a81565b60005b83811015612acf578181015183820152602001612ab7565b838111156117cc5750506000910152565b60008151808452612af8816020860160208601612ab4565b601f01601f19169290920160200192915050565b6020815260006112296020830184612ae0565b600060208284031215612b3157600080fd5b5035919050565b60008060408385031215612b4b57600080fd5b612b5483612a4a565b946020939093013593505050565b600080600060608486031215612b7757600080fd5b612b8084612a4a565b9250612b8e60208501612a4a565b9150604084013590509250925092565b60008060408385031215612bb157600080fd5b82359150612bc160208401612a4a565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612c0857612c08612bca565b604052919050565b60006001600160401b03831115612c2957612c29612bca565b612c3c601f8401601f1916602001612be0565b9050828152838383011115612c5057600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c7857600080fd5b61122983833560208501612c10565b60008060408385031215612c9a57600080fd5b612ca383612a4a565b915060208301356001600160401b03811115612cbe57600080fd5b612cca85828601612c67565b9150509250929050565b60006020808385031215612ce757600080fd5b82356001600160401b0380821115612cfe57600080fd5b818501915085601f830112612d1257600080fd5b813581811115612d2457612d24612bca565b8060051b9150612d35848301612be0565b8181529183018401918481019088841115612d4f57600080fd5b938501935b83851015612d6d57843582529385019390850190612d54565b98975050505050505050565b60008060008060808587031215612d8f57600080fd5b5050823594602084013594506040840135936060013592509050565b80358015158114612a6157600080fd5b60008060408385031215612dce57600080fd5b82359150612bc160208401612dab565b600060208284031215612df057600080fd5b81356001600160401b03811115612e0657600080fd5b8201601f81018413612e1757600080fd5b61262a84823560208401612c10565b60008060408385031215612e3957600080fd5b612e4283612a4a565b9150612bc160208401612dab565b60008060008060808587031215612e6657600080fd5b612e6f85612a4a565b9350612e7d60208601612a4a565b92506040850135915060608501356001600160401b03811115612e9f57600080fd5b612eab87828801612c67565b91505092959194509250565b6101208101818360005b6009811015612ee0578151835260209283019290910190600101612ec1565b50505092915050565b60008060408385031215612efc57600080fd5b612f0583612a4a565b9150612bc160208401612a4a565b634e487b7160e01b600052601160045260246000fd5b60008219821115612f3c57612f3c612f13565b500190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600082821015612feb57612feb612f13565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061301a57607f821691505b6020821081141561095257634e487b7160e01b600052602260045260246000fd5b6000815161304d818560208601612ab4565b9290920192915050565b600080845481600182811c91508083168061307357607f831692505b602080841082141561309357634e487b7160e01b86526022600452602486fd5b8180156130a757600181146130b8576130e5565b60ff198616895284890196506130e5565b60008b81526020902060005b868110156130dd5781548b8201529085019083016130c4565b505084890196505b50505050505061294b818561303b565b60006020828403121561310757600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061318c90830184612ae0565b9695505050505050565b6000602082840312156131a857600080fd5b815161122981612a81565b60006000198214156131c7576131c7612f13565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826131f3576131f36131ce565b500490565b600082613207576132076131ce565b500690565b6000825161321e818460208701612ab4565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220836f278eebae5debc3aee8849c48114342bca81a77f56d2c7554e157a8b4b41c64736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.