Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 19 from a total of 19 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Money | 14731574 | 1403 days ago | IN | 0 ETH | 0.00103579 | ||||
| Public Mint | 14730247 | 1404 days ago | IN | 0.09 ETH | 0.00599587 | ||||
| Public Mint | 14730242 | 1404 days ago | IN | 0.27 ETH | 0.00745634 | ||||
| Public Mint | 14730232 | 1404 days ago | IN | 0.18 ETH | 0.00688323 | ||||
| Set Round Sale K... | 14730164 | 1404 days ago | IN | 0 ETH | 0.00157376 | ||||
| Whitelist Mint | 14730156 | 1404 days ago | IN | 0.08 ETH | 0.00471244 | ||||
| Set Round Sale K... | 14730021 | 1404 days ago | IN | 0 ETH | 0.00168765 | ||||
| Whitelist Mint | 14729984 | 1404 days ago | IN | 0.14 ETH | 0.00253998 | ||||
| Whitelist Mint | 14729964 | 1404 days ago | IN | 0.07 ETH | 0.00408296 | ||||
| Set Round Sale K... | 14729961 | 1404 days ago | IN | 0 ETH | 0.00132302 | ||||
| Whitelist Mint | 14729873 | 1404 days ago | IN | 0.18 ETH | 0.00413423 | ||||
| Set Round Sale K... | 14729738 | 1404 days ago | IN | 0 ETH | 0.00155172 | ||||
| Pre Mint | 14729703 | 1404 days ago | IN | 0 ETH | 0.02822075 | ||||
| Transfer Ownersh... | 14729695 | 1404 days ago | IN | 0 ETH | 0.00066332 | ||||
| Set Sale Config | 14729686 | 1404 days ago | IN | 0 ETH | 0.00236155 | ||||
| Set Sale Config | 14729685 | 1404 days ago | IN | 0 ETH | 0.00257689 | ||||
| Set Sale Config | 14729683 | 1404 days ago | IN | 0 ETH | 0.00283961 | ||||
| Set Sale Config | 14729682 | 1404 days ago | IN | 0 ETH | 0.00253952 | ||||
| Set Base URI | 14729605 | 1404 days ago | IN | 0 ETH | 0.00274731 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 14731574 | 1403 days ago | 1.01 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HerodotusNFTs
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "erc721a/contracts/ERC721A.sol";
contract HerodotusNFTs is Ownable, ERC721A, ReentrancyGuard {
event WhitelistMint(
uint256 indexed roundIndex,
uint256 indexed quantity,
address indexed minter,
uint256 totalMinted
);
event WithdrawMoney(
uint256 indexed blocktime,
uint256 indexed amount,
address indexed sender
);
uint256 public immutable amountForMarketing;
uint256 public immutable collectionSize;
address public immutable vaultAddress;
address public immutable preMinteeAddress;
//1:founding round
//2:six flavor round
//3:partner round
//4:public round
struct SaleConfig {
uint32 roundSaleStartTime;
uint32 roundSaleEndTime;
uint64 roundPrice;
string roundSaleKey;
uint256 summaryRoundSale;
uint32 maxPerAddressDuringMint;
uint32 maxPerRound;
bytes32 merkleRoot;
}
SaleConfig[4] public saleConfigs;
constructor(
uint256 collectionSize_,
uint256 amountForMarketing_,
address vaultAddress_,
address preMinteeAddress_
) ERC721A("HerodotusNFTs", "HDOTUS") {
require(collectionSize_ > 0, "collection must have a nonzero supply");
amountForMarketing = amountForMarketing_;
collectionSize = collectionSize_;
vaultAddress = vaultAddress_;
preMinteeAddress = preMinteeAddress_;
}
modifier callerIsUser() {
require(tx.origin == msg.sender, "The caller is another contract");
_;
}
function _isEqual(string memory s1, string memory s2)
internal
pure
returns (bool)
{
return
keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2));
}
function setSaleConfig(
uint32 _index,
uint32 _roundSaleStartTime,
uint32 _roundSaleEndTime,
uint64 _roundPrice,
uint32 _maxPerAddressDuringMint,
uint32 _maxPerRound,
bytes32 _merkleRoot
) external onlyOwner {
require(
_roundSaleStartTime >= block.timestamp &&
_roundSaleEndTime >= block.timestamp,
"Invalid round start and end time"
);
require(
_maxPerAddressDuringMint > 0,
"max per address must be nonzero"
);
require(_roundPrice >= 0, "Round price must be nonzero");
require(_merkleRoot != "", "Merkle Root should not be empty");
saleConfigs[_index] = SaleConfig(
_roundSaleStartTime,
_roundSaleEndTime,
_roundPrice,
"",
0,
_maxPerAddressDuringMint,
_maxPerRound,
_merkleRoot
);
}
function setRoundSaleKey(uint256 index, string memory key)
external
onlyOwner
{
saleConfigs[index].roundSaleKey = key;
}
function getRoundSaleconfig(uint256 roundIndex)
external
view
returns (SaleConfig memory)
{
return saleConfigs[roundIndex];
}
//Mint Round
mapping(address => uint256) public foundingMinterAllocate;
mapping(address => uint256) public favourMinterAllocate;
mapping(address => uint256) public whitelistMinterAllocate;
mapping(address => uint256) public publicMinterAllocate;
function setMinterAllocate(
uint256 roundIndex,
uint256 quantity,
address minter
) internal {
if (roundIndex == 0) {
foundingMinterAllocate[minter] += quantity;
} else if (roundIndex == 1) {
favourMinterAllocate[minter] += quantity;
} else if (roundIndex == 2) {
whitelistMinterAllocate[minter] += quantity;
} else if (roundIndex == 3) {
publicMinterAllocate[minter] += quantity;
}
}
function getMinterAllocate(uint256 roundIndex, address minter)
internal
view
returns (uint256 allocate)
{
if (roundIndex == 0) {
allocate = foundingMinterAllocate[minter];
} else if (roundIndex == 1) {
allocate = favourMinterAllocate[minter];
} else if (roundIndex == 2) {
allocate = whitelistMinterAllocate[minter];
} else if (roundIndex == 3) {
allocate = publicMinterAllocate[minter];
}
}
function preMint(uint256 quantity) external onlyOwner {
require(
totalSupply() + quantity <= amountForMarketing,
"Too many already minted"
);
_safeMint(preMinteeAddress, quantity);
}
function whitelistMint(
uint256 roundIndex,
uint256 quantity,
bytes32[] calldata _merkleProof,
string memory whitelistSaleKey
) external payable callerIsUser {
require(roundIndex >= 0 && roundIndex < 3, "Invalid round");
//get round config
SaleConfig memory config = saleConfigs[roundIndex];
string memory roundSaleKey = config.roundSaleKey;
uint256 roundPrice = uint256(config.roundPrice);
uint256 roundSaleStartTime = uint256(config.roundSaleStartTime);
uint256 roundSaleEndTime = uint256(config.roundSaleEndTime);
uint256 maxPerAddressDuringMint = uint256(
config.maxPerAddressDuringMint
);
uint256 maxPerDurringRound = uint256(config.maxPerRound);
uint256 summaryRoundSale = config.summaryRoundSale;
bytes32 root = config.merkleRoot;
require(
isRoundSaleOn(
roundPrice,
roundSaleStartTime,
roundSaleEndTime,
roundSaleKey
),
"Mint is not live"
);
require(
_isEqual(whitelistSaleKey, roundSaleKey),
"Called with incorrect mint key"
);
require(quantity > 0, "quantity must not be zero");
///?
require(
totalSupply() + quantity <= collectionSize,
"Reached max supply"
);
require(
summaryRoundSale + quantity <= maxPerDurringRound,
"Reached max for this round"
);
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(
MerkleProof.verify(_merkleProof, root, leaf),
"MerkleProof: Verify fail"
);
{
uint256 index = roundIndex;
uint256 amount = quantity;
uint256 minterAllocate = getMinterAllocate(index, msg.sender);
require(
amount <= maxPerAddressDuringMint - minterAllocate,
"Can not mint this many"
);
setMinterAllocate(index, amount, msg.sender);
_safeMint(msg.sender, amount);
//total sale per round
saleConfigs[index].summaryRoundSale += amount;
refundIfOver(roundPrice * amount);
emit WhitelistMint(index, amount, msg.sender, totalSupply());
}
}
function publicMint(
uint256 roundIndex,
uint256 quantity,
string memory callerRoundSaleKey
) external payable {
require(roundIndex == 3, "Invalid round");
SaleConfig memory config = saleConfigs[roundIndex];
string memory roundSaleKey = config.roundSaleKey;
uint256 roundPrice = uint256(config.roundPrice);
uint256 roundSaleStartTime = uint256(config.roundSaleStartTime);
uint256 maxPerAddressDuringMint = uint256(
config.maxPerAddressDuringMint
);
require(
_isEqual(callerRoundSaleKey, roundSaleKey) &&
!_isEqual(roundSaleKey, ""),
"Called with incorrect sale key"
);
require(
block.timestamp >= roundSaleStartTime,
"Sale has not begun yet"
);
require(quantity > 0, "quantity must not be zero");
require(
totalSupply() + quantity <= collectionSize,
"Reached max supply"
);
uint256 minterAllocate = getMinterAllocate(roundIndex, msg.sender);
require(
quantity <= maxPerAddressDuringMint - minterAllocate,
"Can not mint this many"
);
setMinterAllocate(roundIndex, quantity, msg.sender);
_safeMint(msg.sender, quantity);
saleConfigs[roundIndex].summaryRoundSale += quantity;
refundIfOver(roundPrice * quantity);
}
function refundIfOver(uint256 price) private {
require(msg.value >= price, "Need to send more ETH.");
if (msg.value > price) {
payable(msg.sender).transfer(msg.value - price);
}
}
function isRoundSaleOn(
uint256 roundPriceWei,
uint256 roundSaleStartTime,
uint256 roundSaleEndTime,
string memory roundSaleKey
) public view returns (bool) {
return
roundPriceWei != 0 &&
block.timestamp >= roundSaleStartTime &&
block.timestamp <= roundSaleEndTime &&
!_isEqual(roundSaleKey, "");
}
// // metadata URI
string private _baseTokenURI;
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function setBaseURI(string calldata baseURI) external onlyOwner {
_baseTokenURI = baseURI;
}
function withdrawMoney() external nonReentrant {
require(msg.sender == vaultAddress, "Invalid Address");
(bool success, ) = msg.sender.call{value: address(this).balance}("");
require(success, "Transfer failed.");
emit WithdrawMoney(block.timestamp, address(this).balance, msg.sender);
}
function numberMinted(address _owner) public view returns (uint256) {
return _numberMinted(_owner);
}
function getOwnershipData(uint256 tokenId)
external
view
returns (TokenOwnership memory)
{
return _ownershipOf(tokenId);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = _efficientHash(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to _startTokenId()
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
_addressData[owner].aux = aux;
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) private {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is equivalent to _burn(tokenId, false)
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [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 functionCall(target, data, "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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason 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 {
// 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
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/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForMarketing_","type":"uint256"},{"internalType":"address","name":"vaultAddress_","type":"address"},{"internalType":"address","name":"preMinteeAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"uint256","name":"roundIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"WhitelistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"blocktime","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"WithdrawMoney","type":"event"},{"inputs":[],"name":"amountForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"favourMinterAllocate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"foundingMinterAllocate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundIndex","type":"uint256"}],"name":"getRoundSaleconfig","outputs":[{"components":[{"internalType":"uint32","name":"roundSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"roundSaleEndTime","type":"uint32"},{"internalType":"uint64","name":"roundPrice","type":"uint64"},{"internalType":"string","name":"roundSaleKey","type":"string"},{"internalType":"uint256","name":"summaryRoundSale","type":"uint256"},{"internalType":"uint32","name":"maxPerAddressDuringMint","type":"uint32"},{"internalType":"uint32","name":"maxPerRound","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"internalType":"struct HerodotusNFTs.SaleConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundPriceWei","type":"uint256"},{"internalType":"uint256","name":"roundSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"roundSaleEndTime","type":"uint256"},{"internalType":"string","name":"roundSaleKey","type":"string"}],"name":"isRoundSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preMinteeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundIndex","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"string","name":"callerRoundSaleKey","type":"string"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinterAllocate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"name":"saleConfigs","outputs":[{"internalType":"uint32","name":"roundSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"roundSaleEndTime","type":"uint32"},{"internalType":"uint64","name":"roundPrice","type":"uint64"},{"internalType":"string","name":"roundSaleKey","type":"string"},{"internalType":"uint256","name":"summaryRoundSale","type":"uint256"},{"internalType":"uint32","name":"maxPerAddressDuringMint","type":"uint32"},{"internalType":"uint32","name":"maxPerRound","type":"uint32"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"setRoundSaleKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_index","type":"uint32"},{"internalType":"uint32","name":"_roundSaleStartTime","type":"uint32"},{"internalType":"uint32","name":"_roundSaleEndTime","type":"uint32"},{"internalType":"uint64","name":"_roundPrice","type":"uint64"},{"internalType":"uint32","name":"_maxPerAddressDuringMint","type":"uint32"},{"internalType":"uint32","name":"_maxPerRound","type":"uint32"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"vaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundIndex","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"string","name":"whitelistSaleKey","type":"string"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinterAllocate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101006040523480156200001257600080fd5b5060405162003a4d38038062003a4d83398101604081905262000035916200026e565b6040518060400160405280600d81526020016c4865726f646f7475734e46547360981b8152506040518060400160405280600681526020016548444f54555360d01b815250620000946200008e6200015760201b60201c565b6200015b565b8151620000a9906003906020850190620001ab565b508051620000bf906004906020840190620001ab565b50600060019081556009555050836200012c5760405162461bcd60e51b815260206004820152602560248201527f636f6c6c656374696f6e206d75737420686176652061206e6f6e7a65726f20736044820152647570706c7960d81b606482015260840160405180910390fd5b60809290925260a0929092526001600160601b0319606092831b811660c052911b1660e052620002f5565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001b990620002b8565b90600052602060002090601f016020900481019282620001dd576000855562000228565b82601f10620001f857805160ff191683800117855562000228565b8280016001018555821562000228579182015b82811115620002285782518255916020019190600101906200020b565b50620002369291506200023a565b5090565b5b808211156200023657600081556001016200023b565b80516001600160a01b03811681146200026957600080fd5b919050565b6000806000806080858703121562000284578384fd5b84519350602085015192506200029d6040860162000251565b9150620002ad6060860162000251565b905092959194509250565b600181811c90821680620002cd57607f821691505b60208210811415620002ef57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160601c60e05160601c6136f5620003586000396000818161073f015261155e0152600081816103d50152611cf10152600081816104090152818161123c01526118d30152600081816106de01526114d401526136f56000f3fe60806040526004361061026a5760003560e01c80638ad433ac11610153578063ac446002116100cb578063c79bb9001161007f578063dc33e68111610064578063dc33e68114610781578063e985e9c5146107a1578063f2fde38b146107ea57600080fd5b8063c79bb9001461072d578063c87b56dd1461076157600080fd5b8063b88d4fde116100b0578063b88d4fde146106ac578063bee92237146106cc578063c439101f1461070057600080fd5b8063ac4460021461066a578063b81fdbc31461067f57600080fd5b806395d89b41116101225780639995b9ce116101075780639995b9ce146105fd57806399dbae1a1461061d578063a22cb4651461064a57600080fd5b806395d89b41146105d557806398ce0ffc146105ea57600080fd5b80638ad433ac146105145780638da5cb5b146105345780639231ab2a1461055257806394d6083b146105a957600080fd5b8063430bf08a116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104bf57806370a08231146104df578063715018a6146104ff57600080fd5b806355f804b31461048c578063630683c5146104ac57600080fd5b8063430bf08a146103c357806345c0f533146103f757806348b05c1c1461042b5780635245931c1461045f57600080fd5b806318160ddd1161023d57806323b872dd1161022257806323b872dd146103635780633b85b1791461038357806342842e0e146103a357600080fd5b806318160ddd146103205780631c179e9e1461034357600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102c6578063095ea7b3146102fe575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046130d7565b61080a565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b506102b96108a7565b60405161029b919061345a565b3480156102d257600080fd5b506102e66102e136600461317c565b610939565b6040516001600160a01b03909116815260200161029b565b34801561030a57600080fd5b5061031e6103193660046130ae565b610996565b005b34801561032c57600080fd5b50600254600154035b60405190815260200161029b565b34801561034f57600080fd5b5061031e61035e36600461331b565b610a73565b34801561036f57600080fd5b5061031e61037e366004612fc0565b610d5c565b34801561038f57600080fd5b5061031e61039e366004613194565b610d67565b3480156103af57600080fd5b5061031e6103be366004612fc0565b610dfd565b3480156103cf57600080fd5b506102e67f000000000000000000000000000000000000000000000000000000000000000081565b34801561040357600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000000081565b34801561043757600080fd5b5061044b61044636600461317c565b610e18565b60405161029b98979695949392919061350f565b34801561046b57600080fd5b5061033561047a366004612f74565b601f6020526000908152604090205481565b34801561049857600080fd5b5061031e6104a736600461310f565b610f11565b61031e6104ba366004613281565b610f77565b3480156104cb57600080fd5b506102e66104da36600461317c565b611398565b3480156104eb57600080fd5b506103356104fa366004612f74565b6113aa565b34801561050b57600080fd5b5061031e611412565b34801561052057600080fd5b5061031e61052f36600461317c565b611478565b34801561054057600080fd5b506000546001600160a01b03166102e6565b34801561055e57600080fd5b5061057261056d36600461317c565b611586565b6040805182516001600160a01b0316815260208084015167ffffffffffffffff16908201529181015115159082015260600161029b565b3480156105b557600080fd5b506103356105c4366004612f74565b602080526000908152604090205481565b3480156105e157600080fd5b506102b96115ac565b61031e6105f83660046131d9565b6115bb565b34801561060957600080fd5b5061028f6106183660046132cf565b611b95565b34801561062957600080fd5b50610335610638366004612f74565b601e6020526000908152604090205481565b34801561065657600080fd5b5061031e610665366004613074565b611bdf565b34801561067657600080fd5b5061031e611c8e565b34801561068b57600080fd5b5061033561069a366004612f74565b60216020526000908152604090205481565b3480156106b857600080fd5b5061031e6106c7366004612ffb565b611e2d565b3480156106d857600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000000081565b34801561070c57600080fd5b5061072061071b36600461317c565b611e7e565b60405161029b919061346d565b34801561073957600080fd5b506102e67f000000000000000000000000000000000000000000000000000000000000000081565b34801561076d57600080fd5b506102b961077c36600461317c565b611ffc565b34801561078d57600080fd5b5061033561079c366004612f74565b61209a565b3480156107ad57600080fd5b5061028f6107bc366004612f8e565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b5061031e610805366004612f74565b6120c9565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061086d57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108a157507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600380546108b6906135fd565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906135fd565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b5050505050905090565b6000610944826121a8565b61097a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006109a182611398565b9050806001600160a01b0316836001600160a01b031614156109ef576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610a2c57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b15610a63576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a6e8383836121d4565b505050565b6000546001600160a01b03163314610ad25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b428663ffffffff1610158015610aee5750428563ffffffff1610155b610b3a5760405162461bcd60e51b815260206004820181905260248201527f496e76616c696420726f756e6420737461727420616e6420656e642074696d656044820152606401610ac9565b60008363ffffffff1611610b905760405162461bcd60e51b815260206004820152601f60248201527f6d6178207065722061646472657373206d757374206265206e6f6e7a65726f006044820152606401610ac9565b80610bdd5760405162461bcd60e51b815260206004820152601f60248201527f4d65726b6c6520526f6f742073686f756c64206e6f7420626520656d707479006044820152606401610ac9565b6040518061010001604052808763ffffffff1681526020018663ffffffff1681526020018567ffffffffffffffff168152602001604051806020016040528060008152508152602001600081526020018463ffffffff1681526020018363ffffffff16815260200182815250600a8863ffffffff1660048110610c7057634e487b7160e01b600052603260045260246000fd5b8251600591909102919091018054602080850151604086015167ffffffffffffffff16600160401b027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff63ffffffff9283166401000000000267ffffffffffffffff1990951692909616919091179290921793909316178155606083015180519192610d0492600185019290910190612da2565b506080820151600282015560a082015160038201805460c085015163ffffffff9081166401000000000267ffffffffffffffff1990921693169290921791909117905560e09091015160049091015550505050505050565b610a6e83838361223d565b6000546001600160a01b03163314610dc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b80600a8360048110610de357634e487b7160e01b600052603260045260246000fd5b600502016001019080519060200190610a6e929190612da2565b610a6e83838360405180602001604052806000815250611e2d565b600a8160048110610e2857600080fd5b60050201805460018201805463ffffffff808416955064010000000084041693600160401b90930467ffffffffffffffff16929190610e66906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e92906135fd565b8015610edf5780601f10610eb457610100808354040283529160200191610edf565b820191906000526020600020905b815481529060010190602001808311610ec257829003601f168201915b505050600284015460038501546004909501549394909363ffffffff8083169450640100000000909204909116915088565b6000546001600160a01b03163314610f6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b610a6e60228383612e26565b82600314610fb75760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081c9bdd5b99609a1b6044820152606401610ac9565b6000600a8460048110610fda57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff1692820192909252600182018054919291606084019190611039906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611065906135fd565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050918352505060028201546020820152600382015463ffffffff80821660408085019190915264010000000090920481166060808501919091526004909401546080909301929092529183015191830151835160a0850151949550929367ffffffffffffffff909116928216911661112c8685612497565b801561114e575061114c8460405180602001604052806000815250612497565b155b61119a5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6564207769746820696e636f72726563742073616c65206b657900006044820152606401610ac9565b814210156111ea5760405162461bcd60e51b815260206004820152601660248201527f53616c6520686173206e6f7420626567756e20796574000000000000000000006044820152606401610ac9565b6000871161123a5760405162461bcd60e51b815260206004820152601960248201527f7175616e74697479206d757374206e6f74206265207a65726f000000000000006044820152606401610ac9565b7f0000000000000000000000000000000000000000000000000000000000000000876112696002546001540390565b611273919061356f565b11156112c15760405162461bcd60e51b815260206004820152601260248201527f52656163686564206d617820737570706c7900000000000000000000000000006044820152606401610ac9565b60006112cd89336124f0565b90506112d981836135ba565b8811156113285760405162461bcd60e51b815260206004820152601660248201527f43616e206e6f74206d696e742074686973206d616e79000000000000000000006044820152606401610ac9565b61133389893361258c565b61133d3389612660565b87600a8a6004811061135f57634e487b7160e01b600052603260045260246000fd5b600502016002016000828254611375919061356f565b9091555061138d9050611388898661359b565b61267e565b505050505050505050565b60006113a38261270c565b5192915050565b60006001600160a01b0382166113ec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b0316331461146c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b6114766000612841565b565b6000546001600160a01b031633146114d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b7f0000000000000000000000000000000000000000000000000000000000000000816115016002546001540390565b61150b919061356f565b11156115595760405162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920616c7265616479206d696e7465640000000000000000006044820152606401610ac9565b6115837f000000000000000000000000000000000000000000000000000000000000000082612660565b50565b60408051606081018252600080825260208201819052918101919091526108a18261270c565b6060600480546108b6906135fd565b32331461160a5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610ac9565b6003851061164a5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081c9bdd5b99609a1b6044820152606401610ac9565b6000600a866004811061166d57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff16928201929092526001820180549192916060840191906116cc906135fd565b80601f01602080910402602001604051908101604052809291908181526020018280546116f8906135fd565b80156117455780601f1061171a57610100808354040283529160200191611745565b820191906000526020600020905b81548152906001019060200180831161172857829003601f168201915b50505091835250506002820154602080830191909152600383015463ffffffff8082166040808601919091526401000000009092048116606080860191909152600490950154608094850152938501519085015185519286015160a087015160c08801519588015160e0890151989950939767ffffffffffffffff909316969485169591851694908116939116916117df8787878b611b95565b61182b5760405162461bcd60e51b815260206004820152601060248201527f4d696e74206973206e6f74206c697665000000000000000000000000000000006044820152606401610ac9565b6118358a89612497565b6118815760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6564207769746820696e636f7272656374206d696e74206b657900006044820152606401610ac9565b60008d116118d15760405162461bcd60e51b815260206004820152601960248201527f7175616e74697479206d757374206e6f74206265207a65726f000000000000006044820152606401610ac9565b7f00000000000000000000000000000000000000000000000000000000000000008d6119006002546001540390565b61190a919061356f565b11156119585760405162461bcd60e51b815260206004820152601260248201527f52656163686564206d617820737570706c7900000000000000000000000000006044820152606401610ac9565b826119638e8461356f565b11156119b15760405162461bcd60e51b815260206004820152601a60248201527f52656163686564206d617820666f72207468697320726f756e640000000000006044820152606401610ac9565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611a2a8d8d8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925085915061289e9050565b611a765760405162461bcd60e51b815260206004820152601860248201527f4d65726b6c6550726f6f663a20566572696679206661696c00000000000000006044820152606401610ac9565b8e8e6000611a8483336124f0565b9050611a9081896135ba565b821115611adf5760405162461bcd60e51b815260206004820152601660248201527f43616e206e6f74206d696e742074686973206d616e79000000000000000000006044820152606401610ac9565b611aea83833361258c565b611af43383612660565b81600a8460048110611b1657634e487b7160e01b600052603260045260246000fd5b600502016002016000828254611b2c919061356f565b90915550611b3f9050611388838d61359b565b3382847f312fecb0842229c32cbced3b1826037727e694f1c318d7dc1b976a980c5e0ab1611b706002546001540390565b60405190815260200160405180910390a4505050505050505050505050505050505050565b60008415801590611ba65750834210155b8015611bb25750824211155b8015611bd45750611bd28260405180602001604052806000815250612497565b155b90505b949350505050565b6001600160a01b038216331415611c22576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60026009541415611ce15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ac9565b6002600955336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d5e5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204164647265737300000000000000000000000000000000006044820152606401610ac9565b604051600090339047908381818185875af1925050503d8060008114611da0576040519150601f19603f3d011682016040523d82523d6000602084013e611da5565b606091505b5050905080611df65760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610ac9565b6040513390479042907f43ffec39443ab4d07123ecfd2c982ff41d49e7b434a3b3191d527135d776ef1990600090a4506001600955565b611e3884848461223d565b6001600160a01b0383163b15158015611e5a5750611e58848484846128b4565b155b15611e78576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e0810191909152600a8260048110611edf57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff1692820192909252600182018054919291606084019190611f3e906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6a906135fd565b8015611fb75780601f10611f8c57610100808354040283529160200191611fb7565b820191906000526020600020905b815481529060010190602001808311611f9a57829003601f168201915b505050918352505060028201546020820152600382015463ffffffff808216604084015264010000000090910416606082015260049091015460809091015292915050565b6060612007826121a8565b61203d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120476129a8565b90508051600014156120685760405180602001604052806000815250612093565b80612072846129b7565b6040516020016120839291906133ef565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff166108a1565b6000546001600160a01b031633146121235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b6001600160a01b03811661219f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac9565b61158381612841565b6000600154821080156108a1575050600090815260056020526040902054600160e01b900460ff161590565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006122488261270c565b9050836001600160a01b031681600001516001600160a01b031614612299576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b03861614806122d557506001600160a01b038516600090815260086020908152604080832033845290915290205460ff165b806122f05750336122e584610939565b6001600160a01b0316145b905080612329576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612369576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612375600084876121d4565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661244b57600154821461244b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000816040516020016124aa91906133d3565b60405160208183030381529060405280519060200120836040516020016124d191906133d3565b6040516020818303038152906040528051906020012014905092915050565b60008261251657506001600160a01b0381166000908152601e60205260409020546108a1565b826001141561253e57506001600160a01b0381166000908152601f60205260409020546108a1565b826002141561256557506001600160a01b03811660009081526020805260409020546108a1565b82600314156108a157506001600160a01b0316600090815260216020526040902054919050565b826125c4576001600160a01b0381166000908152601e6020526040812080548492906125b990849061356f565b90915550610a6e9050565b82600114156125f5576001600160a01b0381166000908152601f6020526040812080548492906125b990849061356f565b8260021415612625576001600160a01b0381166000908152602080526040812080548492906125b990849061356f565b8260031415610a6e576001600160a01b0381166000908152602160205260408120805484929061265690849061356f565b9091555050505050565b61267a828260405180602001604052806000815250612b05565b5050565b803410156126ce5760405162461bcd60e51b815260206004820152601660248201527f4e65656420746f2073656e64206d6f7265204554482e000000000000000000006044820152606401610ac9565b8034111561158357336108fc6126e483346135ba565b6040518115909202916000818181858888f1935050505015801561267a573d6000803e3d6000fd5b60408051606081018252600080825260208201819052918101919091528160015481101561280f57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061280d5780516001600160a01b0316156127a3579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612808579392505050565b6127a3565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826128ab8584612b12565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906128e990339089908890889060040161341e565b602060405180830381600087803b15801561290357600080fd5b505af1925050508015612933575060408051601f3d908101601f19168201909252612930918101906130f3565b60015b61298e573d808015612961576040519150601f19603f3d011682016040523d82523d6000602084013e612966565b606091505b508051612986576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bd7565b6060602280546108b6906135fd565b6060816129f757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a215780612a0b81613638565b9150612a1a9050600a83613587565b91506129fb565b60008167ffffffffffffffff811115612a4a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a74576020820181803683370190505b5090505b8415611bd757612a896001836135ba565b9150612a96600a86613653565b612aa190603061356f565b60f81b818381518110612ac457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612afe600a86613587565b9450612a78565b610a6e8383836001612b94565b600081815b8451811015612b8c576000858281518110612b4257634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612b685760008381526020829052604090209250612b79565b600081815260208490526040902092505b5080612b8481613638565b915050612b17565b509392505050565b6001546001600160a01b038516612bd7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83612c0e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015612cca57506001600160a01b0387163b15155b15612d53575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d1b60008884806001019550886128b4565b612d38576040516368d2bf6b60e11b815260040160405180910390fd5b80821415612cd0578260015414612d4e57600080fd5b612d99565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612d54575b50600155612490565b828054612dae906135fd565b90600052602060002090601f016020900481019282612dd05760008555612e16565b82601f10612de957805160ff1916838001178555612e16565b82800160010185558215612e16579182015b82811115612e16578251825591602001919060010190612dfb565b50612e22929150612e9a565b5090565b828054612e32906135fd565b90600052602060002090601f016020900481019282612e545760008555612e16565b82601f10612e6d5782800160ff19823516178555612e16565b82800160010185558215612e16579182015b82811115612e16578235825591602001919060010190612e7f565b5b80821115612e225760008155600101612e9b565b600067ffffffffffffffff80841115612eca57612eca613693565b604051601f8501601f19908116603f01168101908282118183101715612ef257612ef2613693565b81604052809350858152868686011115612f0b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612f3c57600080fd5b919050565b600082601f830112612f51578081fd5b61209383833560208501612eaf565b803563ffffffff81168114612f3c57600080fd5b600060208284031215612f85578081fd5b61209382612f25565b60008060408385031215612fa0578081fd5b612fa983612f25565b9150612fb760208401612f25565b90509250929050565b600080600060608486031215612fd4578081fd5b612fdd84612f25565b9250612feb60208501612f25565b9150604084013590509250925092565b60008060008060808587031215613010578081fd5b61301985612f25565b935061302760208601612f25565b925060408501359150606085013567ffffffffffffffff811115613049578182fd5b8501601f81018713613059578182fd5b61306887823560208401612eaf565b91505092959194509250565b60008060408385031215613086578182fd5b61308f83612f25565b9150602083013580151581146130a3578182fd5b809150509250929050565b600080604083850312156130c0578182fd5b6130c983612f25565b946020939093013593505050565b6000602082840312156130e8578081fd5b8135612093816136a9565b600060208284031215613104578081fd5b8151612093816136a9565b60008060208385031215613121578182fd5b823567ffffffffffffffff80821115613138578384fd5b818501915085601f83011261314b578384fd5b813581811115613159578485fd5b86602082850101111561316a578485fd5b60209290920196919550909350505050565b60006020828403121561318d578081fd5b5035919050565b600080604083850312156131a6578182fd5b82359150602083013567ffffffffffffffff8111156131c3578182fd5b6131cf85828601612f41565b9150509250929050565b6000806000806000608086880312156131f0578283fd5b8535945060208601359350604086013567ffffffffffffffff80821115613215578485fd5b818801915088601f830112613228578485fd5b813581811115613236578586fd5b8960208260051b850101111561324a578586fd5b602083019550809450506060880135915080821115613267578283fd5b5061327488828901612f41565b9150509295509295909350565b600080600060608486031215613295578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156132b9578182fd5b6132c586828701612f41565b9150509250925092565b600080600080608085870312156132e4578182fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561330f578182fd5b61306887828801612f41565b600080600080600080600060e0888a031215613335578485fd5b61333e88612f60565b965061334c60208901612f60565b955061335a60408901612f60565b9450606088013567ffffffffffffffff81168114613376578283fd5b935061338460808901612f60565b925061339260a08901612f60565b915060c0880135905092959891949750929550565b600081518084526133bf8160208601602086016135d1565b601f01601f19169290920160200192915050565b600082516133e58184602087016135d1565b9190910192915050565b600083516134018184602088016135d1565b8351908301906134158183602088016135d1565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261345060808301846133a7565b9695505050505050565b60208152600061209360208301846133a7565b60208152600063ffffffff8084511660208401528060208501511660408401525060408301516134a9606084018267ffffffffffffffff169052565b5060608301516101008060808501526134c66101208501836133a7565b9150608085015160a085015260a08501516134e960c086018263ffffffff169052565b5060c085015163ffffffff811660e08601525060e0949094015192909301919091525090565b600061010063ffffffff808c168452808b16602085015267ffffffffffffffff8a1660408501528160608501526135488285018a6133a7565b608085019890985295861660a084015250509190921660c082015260e00152949350505050565b6000821982111561358257613582613667565b500190565b6000826135965761359661367d565b500490565b60008160001904831182151516156135b5576135b5613667565b500290565b6000828210156135cc576135cc613667565b500390565b60005b838110156135ec5781810151838201526020016135d4565b83811115611e785750506000910152565b600181811c9082168061361157607f821691505b6020821081141561363257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561364c5761364c613667565b5060010190565b6000826136625761366261367d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158357600080fdfea26469706673582212207acfa0fb54270d00855c27cf3256e39024f33075b3d4f77c11dbe91e3c39f9eb64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7
Deployed Bytecode
0x60806040526004361061026a5760003560e01c80638ad433ac11610153578063ac446002116100cb578063c79bb9001161007f578063dc33e68111610064578063dc33e68114610781578063e985e9c5146107a1578063f2fde38b146107ea57600080fd5b8063c79bb9001461072d578063c87b56dd1461076157600080fd5b8063b88d4fde116100b0578063b88d4fde146106ac578063bee92237146106cc578063c439101f1461070057600080fd5b8063ac4460021461066a578063b81fdbc31461067f57600080fd5b806395d89b41116101225780639995b9ce116101075780639995b9ce146105fd57806399dbae1a1461061d578063a22cb4651461064a57600080fd5b806395d89b41146105d557806398ce0ffc146105ea57600080fd5b80638ad433ac146105145780638da5cb5b146105345780639231ab2a1461055257806394d6083b146105a957600080fd5b8063430bf08a116101e657806355f804b3116101b55780636352211e1161019a5780636352211e146104bf57806370a08231146104df578063715018a6146104ff57600080fd5b806355f804b31461048c578063630683c5146104ac57600080fd5b8063430bf08a146103c357806345c0f533146103f757806348b05c1c1461042b5780635245931c1461045f57600080fd5b806318160ddd1161023d57806323b872dd1161022257806323b872dd146103635780633b85b1791461038357806342842e0e146103a357600080fd5b806318160ddd146103205780631c179e9e1461034357600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102c6578063095ea7b3146102fe575b600080fd5b34801561027b57600080fd5b5061028f61028a3660046130d7565b61080a565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b506102b96108a7565b60405161029b919061345a565b3480156102d257600080fd5b506102e66102e136600461317c565b610939565b6040516001600160a01b03909116815260200161029b565b34801561030a57600080fd5b5061031e6103193660046130ae565b610996565b005b34801561032c57600080fd5b50600254600154035b60405190815260200161029b565b34801561034f57600080fd5b5061031e61035e36600461331b565b610a73565b34801561036f57600080fd5b5061031e61037e366004612fc0565b610d5c565b34801561038f57600080fd5b5061031e61039e366004613194565b610d67565b3480156103af57600080fd5b5061031e6103be366004612fc0565b610dfd565b3480156103cf57600080fd5b506102e67f000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda781565b34801561040357600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000271081565b34801561043757600080fd5b5061044b61044636600461317c565b610e18565b60405161029b98979695949392919061350f565b34801561046b57600080fd5b5061033561047a366004612f74565b601f6020526000908152604090205481565b34801561049857600080fd5b5061031e6104a736600461310f565b610f11565b61031e6104ba366004613281565b610f77565b3480156104cb57600080fd5b506102e66104da36600461317c565b611398565b3480156104eb57600080fd5b506103356104fa366004612f74565b6113aa565b34801561050b57600080fd5b5061031e611412565b34801561052057600080fd5b5061031e61052f36600461317c565b611478565b34801561054057600080fd5b506000546001600160a01b03166102e6565b34801561055e57600080fd5b5061057261056d36600461317c565b611586565b6040805182516001600160a01b0316815260208084015167ffffffffffffffff16908201529181015115159082015260600161029b565b3480156105b557600080fd5b506103356105c4366004612f74565b602080526000908152604090205481565b3480156105e157600080fd5b506102b96115ac565b61031e6105f83660046131d9565b6115bb565b34801561060957600080fd5b5061028f6106183660046132cf565b611b95565b34801561062957600080fd5b50610335610638366004612f74565b601e6020526000908152604090205481565b34801561065657600080fd5b5061031e610665366004613074565b611bdf565b34801561067657600080fd5b5061031e611c8e565b34801561068b57600080fd5b5061033561069a366004612f74565b60216020526000908152604090205481565b3480156106b857600080fd5b5061031e6106c7366004612ffb565b611e2d565b3480156106d857600080fd5b506103357f000000000000000000000000000000000000000000000000000000000000022081565b34801561070c57600080fd5b5061072061071b36600461317c565b611e7e565b60405161029b919061346d565b34801561073957600080fd5b506102e67f000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda781565b34801561076d57600080fd5b506102b961077c36600461317c565b611ffc565b34801561078d57600080fd5b5061033561079c366004612f74565b61209a565b3480156107ad57600080fd5b5061028f6107bc366004612f8e565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b5061031e610805366004612f74565b6120c9565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061086d57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108a157507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600380546108b6906135fd565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906135fd565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b5050505050905090565b6000610944826121a8565b61097a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006109a182611398565b9050806001600160a01b0316836001600160a01b031614156109ef576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610a2c57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b15610a63576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a6e8383836121d4565b505050565b6000546001600160a01b03163314610ad25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b428663ffffffff1610158015610aee5750428563ffffffff1610155b610b3a5760405162461bcd60e51b815260206004820181905260248201527f496e76616c696420726f756e6420737461727420616e6420656e642074696d656044820152606401610ac9565b60008363ffffffff1611610b905760405162461bcd60e51b815260206004820152601f60248201527f6d6178207065722061646472657373206d757374206265206e6f6e7a65726f006044820152606401610ac9565b80610bdd5760405162461bcd60e51b815260206004820152601f60248201527f4d65726b6c6520526f6f742073686f756c64206e6f7420626520656d707479006044820152606401610ac9565b6040518061010001604052808763ffffffff1681526020018663ffffffff1681526020018567ffffffffffffffff168152602001604051806020016040528060008152508152602001600081526020018463ffffffff1681526020018363ffffffff16815260200182815250600a8863ffffffff1660048110610c7057634e487b7160e01b600052603260045260246000fd5b8251600591909102919091018054602080850151604086015167ffffffffffffffff16600160401b027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff63ffffffff9283166401000000000267ffffffffffffffff1990951692909616919091179290921793909316178155606083015180519192610d0492600185019290910190612da2565b506080820151600282015560a082015160038201805460c085015163ffffffff9081166401000000000267ffffffffffffffff1990921693169290921791909117905560e09091015160049091015550505050505050565b610a6e83838361223d565b6000546001600160a01b03163314610dc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b80600a8360048110610de357634e487b7160e01b600052603260045260246000fd5b600502016001019080519060200190610a6e929190612da2565b610a6e83838360405180602001604052806000815250611e2d565b600a8160048110610e2857600080fd5b60050201805460018201805463ffffffff808416955064010000000084041693600160401b90930467ffffffffffffffff16929190610e66906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e92906135fd565b8015610edf5780601f10610eb457610100808354040283529160200191610edf565b820191906000526020600020905b815481529060010190602001808311610ec257829003601f168201915b505050600284015460038501546004909501549394909363ffffffff8083169450640100000000909204909116915088565b6000546001600160a01b03163314610f6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b610a6e60228383612e26565b82600314610fb75760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081c9bdd5b99609a1b6044820152606401610ac9565b6000600a8460048110610fda57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff1692820192909252600182018054919291606084019190611039906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611065906135fd565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050918352505060028201546020820152600382015463ffffffff80821660408085019190915264010000000090920481166060808501919091526004909401546080909301929092529183015191830151835160a0850151949550929367ffffffffffffffff909116928216911661112c8685612497565b801561114e575061114c8460405180602001604052806000815250612497565b155b61119a5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6564207769746820696e636f72726563742073616c65206b657900006044820152606401610ac9565b814210156111ea5760405162461bcd60e51b815260206004820152601660248201527f53616c6520686173206e6f7420626567756e20796574000000000000000000006044820152606401610ac9565b6000871161123a5760405162461bcd60e51b815260206004820152601960248201527f7175616e74697479206d757374206e6f74206265207a65726f000000000000006044820152606401610ac9565b7f0000000000000000000000000000000000000000000000000000000000002710876112696002546001540390565b611273919061356f565b11156112c15760405162461bcd60e51b815260206004820152601260248201527f52656163686564206d617820737570706c7900000000000000000000000000006044820152606401610ac9565b60006112cd89336124f0565b90506112d981836135ba565b8811156113285760405162461bcd60e51b815260206004820152601660248201527f43616e206e6f74206d696e742074686973206d616e79000000000000000000006044820152606401610ac9565b61133389893361258c565b61133d3389612660565b87600a8a6004811061135f57634e487b7160e01b600052603260045260246000fd5b600502016002016000828254611375919061356f565b9091555061138d9050611388898661359b565b61267e565b505050505050505050565b60006113a38261270c565b5192915050565b60006001600160a01b0382166113ec576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b0316331461146c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b6114766000612841565b565b6000546001600160a01b031633146114d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b7f0000000000000000000000000000000000000000000000000000000000000220816115016002546001540390565b61150b919061356f565b11156115595760405162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920616c7265616479206d696e7465640000000000000000006044820152606401610ac9565b6115837f000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda782612660565b50565b60408051606081018252600080825260208201819052918101919091526108a18261270c565b6060600480546108b6906135fd565b32331461160a5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610ac9565b6003851061164a5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081c9bdd5b99609a1b6044820152606401610ac9565b6000600a866004811061166d57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff16928201929092526001820180549192916060840191906116cc906135fd565b80601f01602080910402602001604051908101604052809291908181526020018280546116f8906135fd565b80156117455780601f1061171a57610100808354040283529160200191611745565b820191906000526020600020905b81548152906001019060200180831161172857829003601f168201915b50505091835250506002820154602080830191909152600383015463ffffffff8082166040808601919091526401000000009092048116606080860191909152600490950154608094850152938501519085015185519286015160a087015160c08801519588015160e0890151989950939767ffffffffffffffff909316969485169591851694908116939116916117df8787878b611b95565b61182b5760405162461bcd60e51b815260206004820152601060248201527f4d696e74206973206e6f74206c697665000000000000000000000000000000006044820152606401610ac9565b6118358a89612497565b6118815760405162461bcd60e51b815260206004820152601e60248201527f43616c6c6564207769746820696e636f7272656374206d696e74206b657900006044820152606401610ac9565b60008d116118d15760405162461bcd60e51b815260206004820152601960248201527f7175616e74697479206d757374206e6f74206265207a65726f000000000000006044820152606401610ac9565b7f00000000000000000000000000000000000000000000000000000000000027108d6119006002546001540390565b61190a919061356f565b11156119585760405162461bcd60e51b815260206004820152601260248201527f52656163686564206d617820737570706c7900000000000000000000000000006044820152606401610ac9565b826119638e8461356f565b11156119b15760405162461bcd60e51b815260206004820152601a60248201527f52656163686564206d617820666f72207468697320726f756e640000000000006044820152606401610ac9565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611a2a8d8d8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925085915061289e9050565b611a765760405162461bcd60e51b815260206004820152601860248201527f4d65726b6c6550726f6f663a20566572696679206661696c00000000000000006044820152606401610ac9565b8e8e6000611a8483336124f0565b9050611a9081896135ba565b821115611adf5760405162461bcd60e51b815260206004820152601660248201527f43616e206e6f74206d696e742074686973206d616e79000000000000000000006044820152606401610ac9565b611aea83833361258c565b611af43383612660565b81600a8460048110611b1657634e487b7160e01b600052603260045260246000fd5b600502016002016000828254611b2c919061356f565b90915550611b3f9050611388838d61359b565b3382847f312fecb0842229c32cbced3b1826037727e694f1c318d7dc1b976a980c5e0ab1611b706002546001540390565b60405190815260200160405180910390a4505050505050505050505050505050505050565b60008415801590611ba65750834210155b8015611bb25750824211155b8015611bd45750611bd28260405180602001604052806000815250612497565b155b90505b949350505050565b6001600160a01b038216331415611c22576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60026009541415611ce15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ac9565b6002600955336001600160a01b037f000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda71614611d5e5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204164647265737300000000000000000000000000000000006044820152606401610ac9565b604051600090339047908381818185875af1925050503d8060008114611da0576040519150601f19603f3d011682016040523d82523d6000602084013e611da5565b606091505b5050905080611df65760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610ac9565b6040513390479042907f43ffec39443ab4d07123ecfd2c982ff41d49e7b434a3b3191d527135d776ef1990600090a4506001600955565b611e3884848461223d565b6001600160a01b0383163b15158015611e5a5750611e58848484846128b4565b155b15611e78576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e0810191909152600a8260048110611edf57634e487b7160e01b600052603260045260246000fd5b604080516101008101825260059290920292909201805463ffffffff80821684526401000000008204166020840152600160401b900467ffffffffffffffff1692820192909252600182018054919291606084019190611f3e906135fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6a906135fd565b8015611fb75780601f10611f8c57610100808354040283529160200191611fb7565b820191906000526020600020905b815481529060010190602001808311611f9a57829003601f168201915b505050918352505060028201546020820152600382015463ffffffff808216604084015264010000000090910416606082015260049091015460809091015292915050565b6060612007826121a8565b61203d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120476129a8565b90508051600014156120685760405180602001604052806000815250612093565b80612072846129b7565b6040516020016120839291906133ef565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff166108a1565b6000546001600160a01b031633146121235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac9565b6001600160a01b03811661219f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610ac9565b61158381612841565b6000600154821080156108a1575050600090815260056020526040902054600160e01b900460ff161590565b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006122488261270c565b9050836001600160a01b031681600001516001600160a01b031614612299576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b03861614806122d557506001600160a01b038516600090815260086020908152604080832033845290915290205460ff165b806122f05750336122e584610939565b6001600160a01b0316145b905080612329576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612369576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612375600084876121d4565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661244b57600154821461244b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000816040516020016124aa91906133d3565b60405160208183030381529060405280519060200120836040516020016124d191906133d3565b6040516020818303038152906040528051906020012014905092915050565b60008261251657506001600160a01b0381166000908152601e60205260409020546108a1565b826001141561253e57506001600160a01b0381166000908152601f60205260409020546108a1565b826002141561256557506001600160a01b03811660009081526020805260409020546108a1565b82600314156108a157506001600160a01b0316600090815260216020526040902054919050565b826125c4576001600160a01b0381166000908152601e6020526040812080548492906125b990849061356f565b90915550610a6e9050565b82600114156125f5576001600160a01b0381166000908152601f6020526040812080548492906125b990849061356f565b8260021415612625576001600160a01b0381166000908152602080526040812080548492906125b990849061356f565b8260031415610a6e576001600160a01b0381166000908152602160205260408120805484929061265690849061356f565b9091555050505050565b61267a828260405180602001604052806000815250612b05565b5050565b803410156126ce5760405162461bcd60e51b815260206004820152601660248201527f4e65656420746f2073656e64206d6f7265204554482e000000000000000000006044820152606401610ac9565b8034111561158357336108fc6126e483346135ba565b6040518115909202916000818181858888f1935050505015801561267a573d6000803e3d6000fd5b60408051606081018252600080825260208201819052918101919091528160015481101561280f57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061280d5780516001600160a01b0316156127a3579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612808579392505050565b6127a3565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826128ab8584612b12565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906128e990339089908890889060040161341e565b602060405180830381600087803b15801561290357600080fd5b505af1925050508015612933575060408051601f3d908101601f19168201909252612930918101906130f3565b60015b61298e573d808015612961576040519150601f19603f3d011682016040523d82523d6000602084013e612966565b606091505b508051612986576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bd7565b6060602280546108b6906135fd565b6060816129f757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a215780612a0b81613638565b9150612a1a9050600a83613587565b91506129fb565b60008167ffffffffffffffff811115612a4a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a74576020820181803683370190505b5090505b8415611bd757612a896001836135ba565b9150612a96600a86613653565b612aa190603061356f565b60f81b818381518110612ac457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612afe600a86613587565b9450612a78565b610a6e8383836001612b94565b600081815b8451811015612b8c576000858281518110612b4257634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612b685760008381526020829052604090209250612b79565b600081815260208490526040902092505b5080612b8481613638565b915050612b17565b509392505050565b6001546001600160a01b038516612bd7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83612c0e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015612cca57506001600160a01b0387163b15155b15612d53575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d1b60008884806001019550886128b4565b612d38576040516368d2bf6b60e11b815260040160405180910390fd5b80821415612cd0578260015414612d4e57600080fd5b612d99565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612d54575b50600155612490565b828054612dae906135fd565b90600052602060002090601f016020900481019282612dd05760008555612e16565b82601f10612de957805160ff1916838001178555612e16565b82800160010185558215612e16579182015b82811115612e16578251825591602001919060010190612dfb565b50612e22929150612e9a565b5090565b828054612e32906135fd565b90600052602060002090601f016020900481019282612e545760008555612e16565b82601f10612e6d5782800160ff19823516178555612e16565b82800160010185558215612e16579182015b82811115612e16578235825591602001919060010190612e7f565b5b80821115612e225760008155600101612e9b565b600067ffffffffffffffff80841115612eca57612eca613693565b604051601f8501601f19908116603f01168101908282118183101715612ef257612ef2613693565b81604052809350858152868686011115612f0b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612f3c57600080fd5b919050565b600082601f830112612f51578081fd5b61209383833560208501612eaf565b803563ffffffff81168114612f3c57600080fd5b600060208284031215612f85578081fd5b61209382612f25565b60008060408385031215612fa0578081fd5b612fa983612f25565b9150612fb760208401612f25565b90509250929050565b600080600060608486031215612fd4578081fd5b612fdd84612f25565b9250612feb60208501612f25565b9150604084013590509250925092565b60008060008060808587031215613010578081fd5b61301985612f25565b935061302760208601612f25565b925060408501359150606085013567ffffffffffffffff811115613049578182fd5b8501601f81018713613059578182fd5b61306887823560208401612eaf565b91505092959194509250565b60008060408385031215613086578182fd5b61308f83612f25565b9150602083013580151581146130a3578182fd5b809150509250929050565b600080604083850312156130c0578182fd5b6130c983612f25565b946020939093013593505050565b6000602082840312156130e8578081fd5b8135612093816136a9565b600060208284031215613104578081fd5b8151612093816136a9565b60008060208385031215613121578182fd5b823567ffffffffffffffff80821115613138578384fd5b818501915085601f83011261314b578384fd5b813581811115613159578485fd5b86602082850101111561316a578485fd5b60209290920196919550909350505050565b60006020828403121561318d578081fd5b5035919050565b600080604083850312156131a6578182fd5b82359150602083013567ffffffffffffffff8111156131c3578182fd5b6131cf85828601612f41565b9150509250929050565b6000806000806000608086880312156131f0578283fd5b8535945060208601359350604086013567ffffffffffffffff80821115613215578485fd5b818801915088601f830112613228578485fd5b813581811115613236578586fd5b8960208260051b850101111561324a578586fd5b602083019550809450506060880135915080821115613267578283fd5b5061327488828901612f41565b9150509295509295909350565b600080600060608486031215613295578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156132b9578182fd5b6132c586828701612f41565b9150509250925092565b600080600080608085870312156132e4578182fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561330f578182fd5b61306887828801612f41565b600080600080600080600060e0888a031215613335578485fd5b61333e88612f60565b965061334c60208901612f60565b955061335a60408901612f60565b9450606088013567ffffffffffffffff81168114613376578283fd5b935061338460808901612f60565b925061339260a08901612f60565b915060c0880135905092959891949750929550565b600081518084526133bf8160208601602086016135d1565b601f01601f19169290920160200192915050565b600082516133e58184602087016135d1565b9190910192915050565b600083516134018184602088016135d1565b8351908301906134158183602088016135d1565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261345060808301846133a7565b9695505050505050565b60208152600061209360208301846133a7565b60208152600063ffffffff8084511660208401528060208501511660408401525060408301516134a9606084018267ffffffffffffffff169052565b5060608301516101008060808501526134c66101208501836133a7565b9150608085015160a085015260a08501516134e960c086018263ffffffff169052565b5060c085015163ffffffff811660e08601525060e0949094015192909301919091525090565b600061010063ffffffff808c168452808b16602085015267ffffffffffffffff8a1660408501528160608501526135488285018a6133a7565b608085019890985295861660a084015250509190921660c082015260e00152949350505050565b6000821982111561358257613582613667565b500190565b6000826135965761359661367d565b500490565b60008160001904831182151516156135b5576135b5613667565b500290565b6000828210156135cc576135cc613667565b500390565b60005b838110156135ec5781810151838201526020016135d4565b83811115611e785750506000910152565b600181811c9082168061361157607f821691505b6020821081141561363257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561364c5761364c613667565b5060010190565b6000826136625761366261367d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158357600080fdfea26469706673582212207acfa0fb54270d00855c27cf3256e39024f33075b3d4f77c11dbe91e3c39f9eb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7
-----Decoded View---------------
Arg [0] : collectionSize_ (uint256): 10000
Arg [1] : amountForMarketing_ (uint256): 544
Arg [2] : vaultAddress_ (address): 0xf666E8f6505085a1906CdC6eacc1D8f12007EDa7
Arg [3] : preMinteeAddress_ (address): 0xf666E8f6505085a1906CdC6eacc1D8f12007EDa7
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [2] : 000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7
Arg [3] : 000000000000000000000000f666e8f6505085a1906cdc6eacc1d8f12007eda7
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.