Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 3,459 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 35925147 | 3 days ago | IN | 0 ETH | 0.00000485 | ||||
| Set Approval For... | 35917650 | 3 days ago | IN | 0 ETH | 0.00000482 | ||||
| Set Approval For... | 35903078 | 3 days ago | IN | 0 ETH | 0.00000482 | ||||
| Set Approval For... | 35892811 | 3 days ago | IN | 0 ETH | 0.00000555 | ||||
| Safe Transfer Fr... | 35892052 | 3 days ago | IN | 0 ETH | 0.00000646 | ||||
| Set Approval For... | 35724363 | 4 days ago | IN | 0 ETH | 0.00000458 | ||||
| Set Approval For... | 35674469 | 4 days ago | IN | 0 ETH | 0.00000555 | ||||
| Set Approval For... | 35669013 | 4 days ago | IN | 0 ETH | 0.00000482 | ||||
| Set Approval For... | 35663031 | 5 days ago | IN | 0 ETH | 0.0000042 | ||||
| Set Approval For... | 35662145 | 5 days ago | IN | 0 ETH | 0.00000555 | ||||
| Set Approval For... | 35506472 | 6 days ago | IN | 0 ETH | 0.00000482 | ||||
| Set Approval For... | 34918098 | 10 days ago | IN | 0 ETH | 0.00000589 | ||||
| Set Approval For... | 34815040 | 10 days ago | IN | 0 ETH | 0.00000482 | ||||
| Transfer From | 34388627 | 14 days ago | IN | 0 ETH | 0.0000042 | ||||
| Safe Transfer Fr... | 34272124 | 14 days ago | IN | 0 ETH | 0.00000616 | ||||
| Set Approval For... | 34111014 | 15 days ago | IN | 0 ETH | 0.00000435 | ||||
| Safe Transfer Fr... | 34094146 | 16 days ago | IN | 0 ETH | 0.00000528 | ||||
| Set Approval For... | 34033547 | 16 days ago | IN | 0 ETH | 0.00000555 | ||||
| Set Approval For... | 33831737 | 17 days ago | IN | 0 ETH | 0.00000555 | ||||
| Set Approval For... | 33826430 | 17 days ago | IN | 0 ETH | 0.00000567 | ||||
| Safe Transfer Fr... | 33359633 | 21 days ago | IN | 0 ETH | 0.00000618 | ||||
| Safe Transfer Fr... | 33359595 | 21 days ago | IN | 0 ETH | 0.00000618 | ||||
| Safe Transfer Fr... | 33359564 | 21 days ago | IN | 0 ETH | 0.0000052 | ||||
| Set Approval For... | 33078747 | 23 days ago | IN | 0 ETH | 0.00000426 | ||||
| Safe Transfer Fr... | 32646660 | 26 days ago | IN | 0 ETH | 0.00000409 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 17569250 | 154 days ago | 7.83745 ETH | ||||
| 17561069 | 154 days ago | 0.01175 ETH | ||||
| 17560483 | 155 days ago | 0.0094 ETH | ||||
| 17560364 | 155 days ago | 0.0235 ETH | ||||
| 17560321 | 155 days ago | 0.0047 ETH | ||||
| 17560288 | 155 days ago | 0.00235 ETH | ||||
| 17560287 | 155 days ago | 0.00235 ETH | ||||
| 17560287 | 155 days ago | 0.00705 ETH | ||||
| 17560286 | 155 days ago | 0.0094 ETH | ||||
| 17560278 | 155 days ago | 0.00235 ETH | ||||
| 17560278 | 155 days ago | 0.00705 ETH | ||||
| 17560278 | 155 days ago | 0.0235 ETH | ||||
| 17560278 | 155 days ago | 0.0047 ETH | ||||
| 17560277 | 155 days ago | 0.0047 ETH | ||||
| 17560277 | 155 days ago | 0.01645 ETH | ||||
| 17560275 | 155 days ago | 0.00705 ETH | ||||
| 17560275 | 155 days ago | 0.0235 ETH | ||||
| 17560275 | 155 days ago | 0.0235 ETH | ||||
| 17560275 | 155 days ago | 0.0235 ETH | ||||
| 17560274 | 155 days ago | 0.0047 ETH | ||||
| 17560274 | 155 days ago | 0.0235 ETH | ||||
| 17560274 | 155 days ago | 0.00235 ETH | ||||
| 17560274 | 155 days ago | 0.00235 ETH | ||||
| 17560274 | 155 days ago | 0.0188 ETH | ||||
| 17560273 | 155 days ago | 0.00235 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
UwU
Compiler Version
v0.8.24+commit.e11b9ed9
ZkSolc Version
v1.5.3
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "contracts/ERC721A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract UwU is ERC721A, Ownable {
constructor(string memory _baseUri, address initialOwner)
ERC721A("UwU", "UwU")
{
baseUri = _baseUri;
transferOwnership(initialOwner);
_mint(msg.sender, 1);
}
string private baseUri;
bool public mintState;
uint256 public SUPPLY = 3333;
uint256 public COST = 0.00235 ether;
uint256 public constant PER_WALLET = 10;
function cutSupply(uint256 cutAmount) external onlyOwner {
require(SUPPLY - cutAmount >= _totalMinted(), "Change amount");
SUPPLY = SUPPLY - cutAmount;
}
function newSupply(uint256 supply) external onlyOwner {
require(supply <= SUPPLY, "New supply must be lower or equal to current supply");
SUPPLY = supply;
}
function newPublicPrice(uint256 price) external onlyOwner {
require(price <= COST, "New price must be lower or equal to current price");
COST = price;
}
function flipMintState() external onlyOwner {
mintState = !mintState;
}
function publicMint(uint256 quantity) public payable {
require(mintState, "Closed");
require(COST * quantity <= msg.value, "Not enough ETH");
require(quantity <= PER_WALLET, "Limit per wallet");
require(_totalMinted() + quantity <= SUPPLY, "Sold out");
_mint(msg.sender, quantity);
}
function withdraw(address payable wallet) external onlyOwner {
uint256 balance = address(this).balance;
(bool success, ) = wallet.call{value: balance}("");
require(success, "Transfer failed.");
}
function _startTokenId() internal view virtual override returns (uint256) {
return 1;
}
function _baseURI() internal view override returns (string memory) {
return baseUri;
}
function setBaseUri(string memory _uri) external onlyOwner {
baseUri = _uri;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool){
return ERC721A.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.9;
import 'contracts/IERC721A.sol';
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _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 {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID.
* To change the starting token ID, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than `_currentIndex - _startTokenId()` times.
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary 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 virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
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, _toString(tokenId), ".json"))
: '';
}
/**
* @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, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr)
if (curr < _currentIndex) {
uint256 packed = _packedOwnerships[curr];
// If not burned.
if (packed & _BITMASK_BURNED == 0) {
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `curr` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
while (packed == 0) {
packed = _packedOwnerships[--curr];
}
return packed;
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @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) public payable virtual override {
address owner = ownerOf(tokenId);
if (_msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId].value;
}
/**
* @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) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @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. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return
_startTokenId() <= tokenId &&
tokenId < _currentIndex && // If within bounds,
_packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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 {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @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 memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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 {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @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 for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
uint256 toMasked;
uint256 end = startTokenId + quantity;
// Use assembly to loop and emit the `Transfer` event for gas savings.
// The duplicated `log4` removes an extra check and reduces stack juggling.
// The assembly, together with the surrounding Solidity code, have been
// delicately arranged to nudge the compiler into producing optimized opcodes.
assembly {
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
toMasked := and(to, _BITMASK_ADDRESS)
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
startTokenId // `tokenId`.
)
// The `iszero(eq(,))` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
// The compiler will optimize the `iszero` away for performance.
for {
let tokenId := add(startTokenId, 1)
} iszero(eq(tokenId, end)) {
tokenId := add(tokenId, 1)
} {
// Emit the `Transfer` event. Similar to above.
log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
}
}
if (toMasked == 0) revert MintToZeroAddress();
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, 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.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (index < end);
// Reentrancy protection.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev 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 {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// 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 {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) revert OwnershipNotInitializedForExtraData();
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* 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 _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
pragma solidity ^0.8.9;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @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,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` 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 payable;
/**
* @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 payable;
/**
* @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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @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);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}// 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 (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;
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": true,
"mode": "3"
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cutAmount","type":"uint256"}],"name":"cutSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"mintState","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":"uint256","name":"price","type":"uint256"}],"name":"newPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"newSupply","outputs":[],"stateMutability":"nonpayable","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":"publicMint","outputs":[],"stateMutability":"payable","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":"payable","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":"payable","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":"_uri","type":"string"}],"name":"setBaseUri","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000353a0926b384c7bea61d1c3984a0c1f08ac75b64f17cfec7c0b43da1579000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000860e323312dd0c320a72e9375e180ba614eb504f000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f7577756574682e78797a2f6d657461646174612f00000000
Deployed Bytecode
0x0003000000000002000400000000000200000000030100190000006003300270000002d203300197000200000031035500010000000103550000008004000039000000400040043f0000000100200190000000380000c13d000000040030008c0000076d0000413d000000000201043b000000e002200270000002f20020009c000000c80000213d000003060020009c000001150000213d000003100020009c000001530000a13d000003110020009c000001fc0000213d000003140020009c000002440000613d000003150020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000000802000039000000000202041a000002d7022001970000000003000411000000000032004b000003c70000c13d0000000c02000039000000000302041a000000000031004b000003d70000a13d000002f001000041000000800010043f0000002001000039000000840010043f0000003101000039000000a40010043f0000033a01000041000000c40010043f0000033b01000041000000e40010043f0000031b0100004100000b45000104300000000002000416000000000002004b0000076d0000c13d0000001f02300039000002d3022001970000008002200039000000400020043f0000001f0530018f000002d4063001980000008002600039000000480000613d000000000701034f000000007807043c0000000004840436000000000024004b000000440000c13d000000000005004b000000550000613d000000000161034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c0000076d0000413d000000800200043d000002d50020009c0000076d0000213d0000001f01200039000000000031004b0000000004000019000002d604008041000002d601100197000000000001004b0000000005000019000002d605004041000002d60010009c000000000504c019000000000005004b0000076d0000c13d00000080012000390000000001010433000002d50010009c000002b40000213d0000001f0410003900000345044001970000003f044000390000034504400197000000400600043d0000000004460019000000000064004b00000000050000390000000105004039000002d50040009c000002b40000213d0000000100500190000002b40000c13d0000008003300039000000400040043f000400000006001d0000000004160436000300000004001d000000a0022000390000000004210019000000000034004b0000076d0000213d000000000001004b00000003060000290000008b0000613d000000000300001900000000043600190000000005230019000000000505043300000000005404350000002003300039000000000013004b000000840000413d000000040110002900000020011000390000000000010435000000a00100043d000200000001001d000002d70010009c0000076d0000213d000000400500043d000002d80050009c000002b40000213d0000004001500039000000400010043f00000003030000390000000007350436000002d9040000410000000000470435000000400100043d000002d80010009c000002b40000213d0000004002100039000000400020043f000000000231043600000000004204350000000006050433000002d50060009c000002b40000213d0000000204000039000000000804041a000000010980019000000001088002700000007f0880618f0000001f0080008c000000000a000039000000010a0020390000000000a9004b0000031e0000c13d000000200080008c000000c00000413d000000000040043f0000001f096000390000000509900270000002da0990009a000000200060008c000002db090040410000001f088000390000000508800270000002da0880009a000000000089004b000000c00000813d000000000009041b0000000109900039000000000089004b000000bc0000413d0000001f0060008c000005020000a13d000000000040043f0000034509600198000005830000c13d0000002008000039000002db070000410000058f0000013d000002f30020009c000001300000213d000002fd0020009c000001800000a13d000002fe0020009c000002050000213d000003010020009c0000029d0000613d000003020020009c0000076d0000c13d000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b000400000002001d000002d70020009c0000076d0000213d0000002401100370000000000201043b000000000002004b0000000001000039000000010100c039000300000002001d000000000012004b0000076d0000c13d0000000001000411000000000010043f0000000701000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000201041a00000346022001970000000303000029000000000232019f000000000021041b000000400100043d0000000000310435000002d20010009c000002d20100804100000040011002100000000002000414000002d20020009c000002d202008041000000c002200210000000000112019f00000327011001c70000800d020000390000000303000039000003280400004100000000050004110000000406000029000004890000013d000003070020009c000001a50000a13d000003080020009c0000020e0000213d0000030b0020009c000002ba0000613d0000030c0020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000801000039000000000101041a000002d7011001970000000002000411000000000021004b000000000100003900000001010060390b4307f00000040f0000000a01000039000000000201041a0000034603200197000000ff0020019000000001033061bf000000000031041b000000000100001900000b440001042e000002f40020009c000001bb0000a13d000002f50020009c000002210000213d000002f80020009c000002df0000613d000002f90020009c0000076d0000c13d000000440030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000202043b000002d70020009c0000076d0000213d0000002401100370000000000101043b000400000001001d000002d70010009c0000076d0000213d000000000020043f0000000701000039000000200010043f000000400200003900000000010000190b430b240000040f00000004020000290b4308030000040f000000000101041a000000ff001001900000000001000039000000010100c039000003a30000013d000003160020009c000002fc0000613d000003170020009c000003100000613d000003180020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d00000080020000390000000401100370000000000301043b000000000003004b000004a80000613d000000000100041a000000000031004b000004a80000a13d000400000003001d000000000030043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000101041a0000031f00100198000004a70000c13d0000000401000029000000000010043f0000000601000039000000200010043f000000400200003900000000010000190b430b240000040f000000000101041a000003a20000013d000003030020009c000003240000613d000003040020009c000003390000613d000003050020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000303000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000552013f00000001005001900000031e0000c13d000000800010043f000000000004004b000004000000613d000000000030043f000000000001004b0000000002000019000004050000613d000002de030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b0000019d0000413d000004050000013d0000030d0020009c000003420000613d0000030e0020009c000003540000613d0000030f0020009c0000076d0000c13d00000000010300190b4307890000040f000400000001001d000300000002001d000200000003001d000000400100043d000100000001001d0b43079b0000040f000000010400002900000000000404350000000401000029000000030200002900000002030000290b4309160000040f000000000100001900000b440001042e000002fa0020009c0000035b0000613d000002fb0020009c000003660000613d000002fc0020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d00000080030000390000000401100370000000000201043b000000000002004b000003d00000613d000000000100041a000000000021004b000003d00000a13d000400000002001d000000000020043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000400300043d000000000101043b000000000101041a0000031f00100198000003d00000c13d0000000905000039000000000405041a000000010640019000000001024002700000007f0220618f0000001f0020008c00000000010000390000000101002039000000000114013f00000001001001900000031e0000c13d0000000001230436000000000006004b000005690000613d000000000050043f000000000002004b00000000040000190000056e0000613d000002e50500004100000000040000190000000006410019000000000705041a000000000076043500000001055000390000002004400039000000000024004b000001f40000413d0000056e0000013d000003120020009c0000036e0000613d000003130020009c0000076d0000c13d00000000010300190b4307890000040f0b4308130000040f000000000100001900000b440001042e000002ff0020009c000003790000613d000003000020009c0000076d0000c13d0000000001000416000000000001004b0000076d0000c13d0000000c010000390000036a0000013d000003090020009c0000039a0000613d0000030a0020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b000002d70010009c0000076d0000213d000000000001004b000004180000c13d0000032c01000041000000800010043f0000032d0100004100000b4500010430000002f60020009c000003aa0000613d000002f70020009c0000076d0000c13d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000802000039000000000202041a000002d7022001970000000003000411000000000032004b000003c70000c13d0000000b02000039000000000302041a0000000401100370000000000101043b000000000113004b000004a10000413d000000000300041a000000010330008a000000000031004b000003d70000813d000002f001000041000000800010043f0000002001000039000000840010043f0000000d01000039000000a40010043f0000031901000041000000c40010043f0000031a0100004100000b4500010430000000440030008c0000076d0000413d0000000402100370000000000202043b000300000002001d000002d70020009c0000076d0000213d00000080020000390000002401100370000000000301043b000000000003004b000004160000613d000000000100041a000000000031004b000004160000a13d000200000003001d000000000030043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000101041a0000031f00100198000004be0000c13d000000000001004b0000027a0000c13d000400020000002d0000000401000029000000010110008a000400000001001d000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000000000001004b000002670000613d000402d70010019b0000000002000411000000040020006c000005c20000c13d0000000201000029000000000010043f0000000601000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d0000000302000029000002d706200197000000000101043b000000000201041a000002e002200197000000000262019f000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d0200003900000004030000390000033d0400004100000004050000290000000207000029000004890000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000402100370000000000502043b000002d50050009c0000076d0000213d0000002302500039000000000032004b0000076d0000813d0000000406500039000000000261034f000000000202043b000002d50020009c000002b40000213d0000001f0720003900000345077001970000003f077000390000034507700197000003290070009c0000042f0000a13d0000033001000041000000000010043f0000004101000039000000040010043f000003310100004100000b4500010430000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b000400000001001d000002d70010009c0000076d0000213d0000000801000039000000000101041a000002d7011001970000000002000411000000000021004b000003c70000c13d0000032e010000410000000000100443000000000100041000000004001004430000000001000414000002d20010009c000002d201008041000000c0011002100000032f011001c70000800a020000390b430b3e0000040f00000001002001900000076f0000613d000000000301043b00000000010004140000000404000029000000040040008c000004af0000c13d00000001020000390000000001000031000004c90000013d000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0000000802000039000000000202041a000002d7022001970000000003000411000000000032004b000003c70000c13d0000000b02000039000000000302041a000000000031004b000003d70000a13d000002f001000041000000800010043f0000002001000039000000840010043f0000003301000039000000a40010043f0000031d01000041000000c40010043f0000031e01000041000000e40010043f0000031b0100004100000b4500010430000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000201043b00000340002001980000076d0000c13d00000001010000390000034102200197000003420020009c000004200000613d000003430020009c000004200000613d000003440020009c000000000100c019000000800010043f000003260100004100000b440001042e0000000001000416000000000001004b0000076d0000c13d0000000203000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000552013f0000000100500190000003da0000613d0000033001000041000000000010043f0000002201000039000000040010043f000003310100004100000b45000104300000000001000416000000000001004b0000076d0000c13d0000000801000039000000000201041a000002d7032001970000000005000411000000000053004b000003c70000c13d000002e002200197000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000303000039000002e2040000410000000006000019000004890000013d0000000001000416000000000001004b0000076d0000c13d0000000801000039000000000101041a000002d701100197000000800010043f000003260100004100000b440001042e000000240030008c0000076d0000413d0000000401100370000000000401043b0000000a01000039000000000101041a000000ff00100190000003eb0000c13d000002f001000041000000800010043f0000002001000039000000840010043f0000000601000039000000a40010043f0000033901000041000000c40010043f0000031a0100004100000b45000104300000000001000416000000000001004b0000076d0000c13d0000000a01000039000000800010043f000003260100004100000b440001042e0000000001000416000000000001004b0000076d0000c13d0000000a01000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000003260100004100000b440001042e0000000001000416000000000001004b0000076d0000c13d0000000b01000039000000000101041a000000800010043f000003260100004100000b440001042e0000000001000416000000000001004b0000076d0000c13d0000000101000039000000000101041a0000034701100167000000000200041a0000000001120019000000800010043f000003260100004100000b440001042e000000840030008c0000076d0000413d0000000402100370000000000202043b000400000002001d000002d70020009c0000076d0000213d0000002402100370000000000202043b000300000002001d000002d70020009c0000076d0000213d0000006402100370000000000402043b000002d50040009c0000076d0000213d0000002302400039000000000032004b0000076d0000813d0000000402400039000000000121034f000000000201043b00000024014000390b4307b80000040f00000044020000390000000102200367000000000302043b0000000004010019000000040100002900000003020000290b4309160000040f000000000100001900000b440001042e000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000101043b0b430aeb0000040f000002d701100197000000400200043d0000000000120435000002d20020009c000002d20200804100000040012002100000031c011001c700000b440001042e000000240030008c0000076d0000413d0000000002000416000000000002004b0000076d0000c13d0000000401100370000000000601043b000002d70060009c0000076d0000213d0000000801000039000000000201041a000002d7032001970000000005000411000000000053004b000003c70000c13d000000000006004b0000047e0000c13d000002f001000041000000800010043f0000002001000039000000840010043f0000002601000039000000a40010043f000002ef01000041000000c40010043f000002ee01000041000000e40010043f0000031b0100004100000b4500010430000002f001000041000000800010043f0000002001000039000000840010043f000000a40010043f0000032a01000041000000c40010043f0000031a0100004100000b450001043000000324010000410000000000130435000002d20030009c000002d203008041000000400130021000000325011001c700000b4500010430000000000012041b000000000100001900000b440001042e000000800010043f000000000004004b000004000000613d000000000030043f000000000001004b0000000002000019000004050000613d000002db030000410000000002000019000000000403041a000000a005200039000000000045043500000001033000390000002002200039000000000012004b000003e30000413d000004050000013d0000000c01000039000000000201041a00000000014200a9000000000002004b000003f30000613d00000000022100d9000000000042004b000004a10000c13d0000000002000416000000000021004b000004230000a13d000002f001000041000000800010043f0000002001000039000000840010043f0000000e01000039000000a40010043f0000033801000041000000c40010043f0000031a0100004100000b45000104300000034602200197000000a00020043f000000000001004b00000020020000390000000002006039000000200220003900000080010000390b4307a60000040f000000400100043d000400000001001d00000080020000390b4307740000040f00000004020000290000000001210049000002d20010009c000002d2010080410000006001100210000002d20020009c000002d2020080410000004002200210000000000121019f00000b440001042e0000033e01000041000004a90000013d000000000010043f0000000501000039000000200010043f000000400200003900000000010000190b430b240000040f000000000101041a000002d501100197000000800010043f000003260100004100000b440001042e0000000b0040008c0000048e0000413d000002f001000041000000800010043f0000002001000039000000840010043f0000001001000039000000a40010043f0000033701000041000000c40010043f0000031a0100004100000b450001043000000024055000390000008007700039000000400070043f000000800020043f0000000005520019000000000035004b0000076d0000213d0000002003600039000000000331034f00000345052001980000001f0620018f000000a001500039000004420000613d000000a007000039000000000803034f000000008908043c0000000007970436000000000017004b0000043e0000c13d000000000006004b0000044f0000613d000000000353034f0000000305600210000000000601043300000000065601cf000000000656022f000000000303043b0000010005500089000000000353022f00000000035301cf000000000363019f0000000000310435000000a00120003900000000000104350000000801000039000000000101041a000002d7011001970000000002000411000000000021004b000007020000c13d000000800200043d000002d50020009c000002b40000213d0000000901000039000000000501041a000000010050019000000001035002700000007f0330618f0000001f0030008c00000000060000390000000106002039000000000565013f00000001005001900000031e0000c13d000000200030008c000004760000413d000000000010043f0000001f052000390000000505500270000002e40550009a000000200020008c000002e5050040410000001f033000390000000503300270000002e40330009a000000000035004b000004760000813d000000000005041b0000000105500039000000000035004b000004720000413d0000001f0020008c000006320000a13d000000000010043f0000034504200198000006980000c13d000000a005000039000002e503000041000006a60000013d000002e002200197000000000262019f000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000303000039000002e2040000410b430b390000040f00000001002001900000076d0000613d000000000100001900000b440001042e000000000300041a000000010130008a000000000041001a000004a10000413d00000000014100190000000b02000039000000000202041a000000000021004b000004b60000a13d000002f001000041000000800010043f0000002001000039000000840010043f0000000801000039000000a40010043f0000033601000041000000c40010043f0000031a0100004100000b45000104300000033001000041000000000010043f0000001101000039000000040010043f000003310100004100000b4500010430000000400200043d0000033f010000410000000000120435000002d20020009c000002d202008041000000400120021000000325011001c700000b4500010430000002d20010009c000002d201008041000000c001100210000000000003004b000004c10000c13d0000000002040019000004c40000013d000400000003001d000200000004001d000000000004004b0000050d0000c13d0000033501000041000000800010043f0000032d0100004100000b4500010430000000400200043d0000033e01000041000004a90000013d000002e1011001c7000080090200003900000000050000190b430b390000040f00020000000103550000006001100270000002d20010019d000002d201100197000000000001004b000004d90000c13d00000001002001900000048c0000c13d000000400100043d000000440210003900000332030000410000000000320435000000240210003900000010030000390000000000320435000002f0020000410000000000210435000000040210003900000020030000390000070c0000013d000002d50010009c000002b40000213d0000001f0410003900000345044001970000003f044000390000034505400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000002d50050009c000002b40000213d0000000100600190000002b40000c13d000000400050043f000000000614043600000345031001980000001f0410018f00000000013600190000000205000367000004f40000613d000000000705034f000000007807043c0000000006860436000000000016004b000004f00000c13d000000000004004b000004cb0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000004cb0000013d000000000006004b00000000050000190000059b0000613d0000000305600210000003470550027f00000347055001670000000007070433000000000557016f0000000106600210000000000565019f0000059b0000013d0000000001000411000002d701100197000300000001001d000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000020200002900000333022000d1000000000101043b000000000301041a0000000002230019000000000021041b000002e90100004100000000001004430000000001000414000002d20010009c000002d201008041000000c001100210000002ea011001c70000800b020000390b430b3e0000040f00000001002001900000076f0000613d000000000101043b000100000001001d0000000401000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d0000000102000029000000a0022002100000000203000029000000010030008c0000000003000019000002eb03006041000000000223019f0000000306000029000000000262019f000000000101043b000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000403000039000002ec04000041000000000500001900000004070000290b430b390000040f00000001002001900000076d0000613d0000000402000029000200020020002d00000004070000290000000107700039000000020070006c000006c10000613d0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000403000039000002ec0400004100000000050000190000000306000029000400000007001d0b430b390000040f0000000100200190000005560000c13d0000076d0000013d00000346044001970000000000410435000000000002004b000000200400003900000000040060390000003f0240003900000345052001970000000002350019000000000052004b00000000050000390000000105004039000002d50020009c000002b40000213d0000000100500190000002b40000c13d000000400020043f0000000005030433000000000005004b000005e40000c13d000003230020009c000002b40000213d0000002001200039000000400010043f0000000000020435000000400300043d000006240000013d000002db070000410000002008000039000000010a90008a000000050aa00270000002dc0aa0009a000000000b580019000000000b0b04330000000000b7041b000000200880003900000001077000390000000000a7004b000005880000c13d000000000069004b000005990000813d0000000309600210000000f80990018f000003470990027f000003470990016700000000055800190000000005050433000000000595016f000000000057041b000000010560021000000001055001bf000000000054041b0000000004010433000002d50040009c000002b40000213d000000000603041a000000010060019000000001056002700000007f0550618f0000001f0050008c00000000070000390000000107002039000000000676013f00000001006001900000031e0000c13d000000200050008c000005ba0000413d000000000030043f0000001f064000390000000506600270000002dd0660009a000000200040008c000002de060040410000001f055000390000000505500270000002dd0550009a000000000056004b000005ba0000813d000000000006041b0000000106600039000000000056004b000005b60000413d000000200040008c000006270000413d000000000030043f00000345064001980000063c0000c13d0000002005000039000002de02000041000006480000013d0000000401000029000000000010043f0000000701000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b0000000002000411000002d702200197000000000020043f000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000101041a000000ff001001900000027e0000c13d000000400100043d0000033c02000041000006c50000013d000000a005200039000000400050043f0000008005200039000000000005043500000004090000290000000006050019000000090090008c0000000a5990011a000000f807500210000000010560008a00000000080504330000032008800197000000000787019f00000321077001c70000000000750435000005e90000213d00000000026200490000008102200039000000210660008a0000000000260435000000400200043d00000020072000390000000003030433000000000003004b000006050000613d00000000080000190000000009780019000000000a810019000000000a0a04330000000000a904350000002008800039000000000038004b000005fe0000413d000000000173001900000000000104350000000003060433000000000003004b000006120000613d000000000600001900000000071600190000000008560019000000000808043300000000008704350000002006600039000000000036004b0000060b0000413d00000000011300190000032203000041000000000031043500000000012100490000001b0310008a0000000000320435000000240110003900000345011001970000000004210019000000000014004b000000000100003900000001010040390000000003040019000002d50040009c000002b40000213d0000000100100190000002b40000c13d000000400030043f0000000001030019000400000001001d0000040b0000013d000000000004004b0000000001000019000006540000613d0000000301400210000003470110027f00000347011001670000000002020433000000000112016f0000000102400210000000000121019f000006540000013d000000000002004b0000000003000019000006360000613d000000a00300043d0000000304200210000003470440027f0000034704400167000000000443016f0000000103200210000006b10000013d000002de020000410000002005000039000000010760008a0000000507700270000002df0770009a00000000081500190000000008080433000000000082041b00000020055000390000000102200039000000000072004b000006410000c13d000000000046004b000006520000813d0000000306400210000000f80660018f000003470660027f000003470660016700000000011500190000000001010433000000000161016f000000000012041b000000010140021000000001011001bf000000000013041b0000000101000039000000000010041b0000000001000411000002d7061001970000000804000039000000000104041a000002e002100197000000000262019f000000000024041b0000000002000414000002d705100197000002d20020009c000002d202008041000000c001200210000002e1011001c70000800d02000039000002e204000041000100000006001d0b430b390000040f00000001002001900000076d0000613d00000d05010000390000000b02000039000000000012041b000002e3010000410000000c02000039000000000012041b00000004010000290000000002010433000002d50020009c000002b40000213d0000000901000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f00000001004001900000031e0000c13d000000200030008c000006900000413d000000000010043f0000001f042000390000000504400270000002e40440009a000000200020008c000002e5040040410000001f033000390000000503300270000002e40330009a000000000034004b000006900000813d000000000004041b0000000104400039000000000034004b0000068c0000413d000000200020008c000006b50000413d000000000010043f0000034505200198000006cb0000c13d0000002004000039000002e503000041000006d80000013d000002e5030000410000002006000039000000010540008a0000000505500270000002e60550009a000000000706001900000080067000390000000006060433000000000063041b00000020067000390000000103300039000000000053004b0000069d0000c13d000000a005700039000000000024004b000006af0000813d0000000304200210000000f80440018f000003470440027f00000347044001670000000005050433000000000445016f000000000043041b00000001030000390000000104200210000000000234019f000000000021041b000000000100001900000b440001042e000000000002004b0000000003000019000006e40000613d0000000303200210000003470330027f000003470330016700000003040000290000000004040433000000000334016f0000000102200210000000000323019f000006e40000013d000000030000006b000007700000c13d000000400100043d00000334020000410000000000210435000002d20010009c000002d201008041000000400110021000000325011001c700000b4500010430000002e5030000410000002004000039000000010650008a0000000506600270000002e60660009a000000040800002900000000078400190000000007070433000000000073041b00000020044000390000000103300039000000000063004b000006d10000c13d000000000025004b000006e20000813d0000000305200210000000f80550018f000003470550027f000003470550016700000004044000290000000004040433000000000454016f000000000043041b000000010220021000000001032001bf000000000031041b0000000801000039000000000101041a000002d7021001970000000003000411000000000032004b000007020000c13d0000000202000029000002d706200198000007120000c13d000000400100043d0000006402100039000002ee0300004100000000003204350000004402100039000002ef030000410000000000320435000000240210003900000026030000390000000000320435000002f0020000410000000000210435000000040210003900000020030000390000000000320435000002d20010009c000002d2010080410000004001100210000002f1011001c700000b4500010430000000400100043d00000044021000390000032a030000410000000000320435000002f002000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000002d20010009c000002d20100804100000040011002100000032b011001c700000b4500010430000002e001100197000000000161019f0000000802000039000000000012041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000303000039000002e20400004100000000050004110b430b390000040f00000001002001900000076d0000613d000000000100041a000400000001001d0000000101000029000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d000000000101043b000000000201041a000002e80220009a000000000021041b0000000401000029000000000010043f0000000401000039000000200010043f000002e90100004100000000001004430000000001000414000002d20010009c000002d201008041000000c001100210000002ea011001c70000800b020000390b430b3e0000040f00000001002001900000076f0000613d000000000101043b000300000001001d0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f00000001002001900000076d0000613d0000000302000029000000a0022002100000000106000029000000000262019f000002eb022001c7000000000101043b000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000403000039000002ec04000041000000000500001900000004070000290b430b390000040f00000001002001900000076d0000613d000000010000006b000006c30000613d00000004010000290000000101100039000000000010041b000000200100003900000100001004430000012000000443000002ed0100004100000b440001042e000000000100001900000b4500010430000000000001042f0000000201000029000000000010041b000000000100001900000b440001042e00000020030000390000000004310436000000003202043400000000002404350000004001100039000000000002004b000007830000613d000000000400001900000000051400190000000006430019000000000606043300000000006504350000002004400039000000000024004b0000077c0000413d000000000312001900000000000304350000001f0220003900000345022001970000000001120019000000000001042d000003480010009c000007990000213d000000630010008c000007990000a13d00000001030003670000000401300370000000000101043b000002d70010009c000007990000213d0000002402300370000000000202043b000002d70020009c000007990000213d0000004403300370000000000303043b000000000001042d000000000100001900000b4500010430000003490010009c000007a00000813d0000002001100039000000400010043f000000000001042d0000033001000041000000000010043f0000004101000039000000040010043f000003310100004100000b45000104300000001f0220003900000345022001970000000001120019000000000021004b00000000020000390000000102004039000002d50010009c000007b20000213d0000000100200190000007b20000c13d000000400010043f000000000001042d0000033001000041000000000010043f0000004101000039000000040010043f000003310100004100000b450001043000000000040100190000034a0020009c000007e80000813d0000001f0120003900000345011001970000003f011000390000034505100197000000400100043d0000000005510019000000000015004b00000000070000390000000107004039000002d50050009c000007e80000213d0000000100700190000007e80000c13d000000400050043f00000000052104360000000007420019000000000037004b000007ee0000213d00000345062001980000001f0720018f00000001044003670000000003650019000007d80000613d000000000804034f0000000009050019000000008a08043c0000000009a90436000000000039004b000007d40000c13d000000000007004b000007e50000613d000000000464034f0000000306700210000000000703043300000000076701cf000000000767022f000000000404043b0000010006600089000000000464022f00000000046401cf000000000474019f000000000043043500000000022500190000000000020435000000000001042d0000033001000041000000000010043f0000004101000039000000040010043f000003310100004100000b4500010430000000000100001900000b4500010430000000000001004b000007f30000613d000000000001042d000000400100043d00000044021000390000032a030000410000000000320435000002f002000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000002d20010009c000002d20100804100000040011002100000032b011001c700000b4500010430000002d702200197000000000020043f000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000008110000613d000000000101043b000000000001042d000000000100001900000b45000104300007000000000002000300000002001d000500000001001d000600000003001d000000000003004b000009040000613d000000000100041a000000060010006c000009040000a13d0000000601000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000101041a0000031f00100198000009040000c13d000000000001004b000008430000c13d0000000602000029000000010220008a000700000002001d000000000020043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000101041a000000000001004b0000000702000029000008300000613d0000000502000029000002d702200197000400000001001d000002d701100197000700000002001d000000000021004b000009070000c13d0000000601000029000000000010043f0000000601000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000201043b000000000302041a0000000001000411000002d704100197000000070040006c000008820000613d000000000034004b000008820000613d000500000004001d000100000003001d000200000002001d0000000701000029000000000010043f0000000701000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b0000000502000029000000000020043f000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000101041a000000ff00100190000000020200002900000001030000290000090e0000613d0000000301000029000502d70010019c0000090a0000613d000000000003004b000008880000613d000000000002041b0000000701000029000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000201041a000000010220008a000000000021041b0000000501000029000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000201041a0000000102200039000000000021041b000002e90100004100000000001004430000000001000414000002d20010009c000002d201008041000000c001100210000002ea011001c70000800b020000390b430b3e0000040f00000001002001900000090d0000613d000000000101043b000300000001001d0000000601000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d0000000302000029000000a00220021000000005022001af000002eb022001c7000000000101043b000000000021041b0000000401000029000002eb00100198000008f30000c13d00000006010000290000000101100039000300000001001d000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b000000000101041a000000000001004b000008f30000c13d000000000100041a000000030010006b000008f30000613d0000000301000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f0000000100200190000009020000613d000000000101043b0000000402000029000000000021041b0000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000403000039000002ec040000410000000705000029000000050600002900000006070000290b430b390000040f0000000100200190000009020000613d000000000001042d000000000100001900000b4500010430000000400100043d0000033e02000041000009100000013d000000400100043d0000034b02000041000009100000013d000000400100043d0000034d02000041000009100000013d000000000001042f000000400100043d0000034c020000410000000000210435000002d20010009c000002d201008041000000400110021000000325011001c700000b4500010430000a000000000002000100000004001d000500000002001d000600000001001d000700000003001d000000000003004b00000a990000613d000000000100041a000000070010006c00000a990000a13d0000000701000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000101041a0000031f0010019800000a990000c13d000000000001004b000009470000c13d0000000702000029000000010220008a000800000002001d000000000020043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000101041a000000000001004b0000000802000029000009340000613d0000000602000029000002d702200197000300000001001d000002d701100197000800000002001d000000000021004b00000a9d0000c13d0000000701000029000000000010043f0000000601000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000301043b000000000403041a0000000001000411000002d702100197000400000002001d000000080020006c000009860000613d000000040040006b000009860000613d000200000004001d000600000003001d0000000801000029000000000010043f0000000701000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b0000000402000029000000000020043f000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000101041a000000ff001001900000000603000029000000020400002900000aa30000613d0000000501000029000002d70110019800000aa00000613d000600000001001d000000000004004b0000098d0000613d000000000003041b0000000801000029000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000201041a000000010220008a000000000021041b0000000601000029000000000010043f0000000501000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000201041a0000000102200039000000000021041b000002e90100004100000000001004430000000001000414000002d20010009c000002d201008041000000c001100210000002ea011001c70000800b020000390b430b3e0000040f000000010020019000000a9c0000613d000000000101043b000200000001001d0000000701000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d0000000202000029000000a0022002100000000606000029000000000262019f000002eb022001c7000000000101043b000000000021041b0000000301000029000002eb00100198000009fb0000c13d00000007010000290000000101100039000200000001001d000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b000000000101041a000000000001004b0000000606000029000009fb0000c13d000000000100041a000000020010006b000009fb0000613d0000000201000029000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000a970000613d000000000101043b0000000302000029000000000021041b00000006060000290000000001000414000002d20010009c000002d201008041000000c001100210000002e1011001c70000800d020000390000000403000039000002ec04000041000000080500002900000007070000290b430b390000040f000000010020019000000a970000613d0000034e010000410000000000100443000000050100002900000004001004430000000001000414000002d20010009c000002d201008041000000c0011002100000032f011001c700008002020000390b430b3e0000040f000000010020019000000a9c0000613d000000000101043b000000000001004b00000a960000613d0000000008000415000000400b00043d0000006401b00039000000800700003900000000007104350000004401b00039000000070200002900000000002104350000002401b00039000000080200002900000000002104350000034f0100004100000000001b04350000000401b00039000000040200002900000000002104350000008403b00039000000010100002900000000210104340000000000130435000000a403b00039000000000001004b00000a370000613d000000000400001900000000053400190000000006420019000000000606043300000000006504350000002004400039000000000014004b00000a300000413d0000000002310019000000000002043500000000040004140000000602000029000000040020008c00000a450000c13d00000000050004150000000a0550008a00000005055002100000000003000031000000200030008c0000002004000039000000000403401900000a7e0000013d000700000008001d000500000007001d0000001f011000390000034501100197000000a401100039000002d20010009c000002d2010080410000006001100210000002d200b0009c000002d20300004100000000030b40190000004003300210000000000131019f000002d20040009c000002d204008041000000c003400210000000000113019f00080000000b001d0b430b390000040f000000080b00002900000000030100190000006003300270000002d203300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b001900000a690000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b00000a650000c13d000000000006004b00000a760000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000005000415000000090550008a0000000505500210000000010020019000000aa60000613d00000007080000290000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000002d50010009c00000adc0000213d000000010020019000000adc0000c13d000000400010043f000000200030008c00000a970000413d00000000010b0433000003400010019800000a970000c13d0000000502500270000000000201001f00000000020004150000000002280049000000000200000200000341011001970000034f0010009c00000ad40000c13d000000000001042d000000000100001900000b4500010430000000400100043d0000033e0200004100000ad60000013d000000000001042f000000400100043d0000034b0200004100000ad60000013d000000400100043d0000034d0200004100000ad60000013d000000400100043d0000034c0200004100000ad60000013d000000000003004b00000aaa0000c13d000000600200003900000ad10000013d0000001f02300039000002d3022001970000003f022000390000035004200197000000400200043d0000000004420019000000000024004b00000000050000390000000105004039000002d50040009c00000adc0000213d000000010050019000000adc0000c13d000000400040043f0000001f0430018f0000000006320436000002d405300198000500000006001d000000000356001900000ac40000613d000000000601034f0000000507000029000000006806043c0000000007870436000000000037004b00000ac00000c13d000000000004004b00000ad10000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001020433000000000001004b00000ae20000c13d000000400100043d00000351020000410000000000210435000002d20010009c000002d201008041000000400110021000000325011001c700000b45000104300000033001000041000000000010043f0000004101000039000000040010043f000003310100004100000b45000104300000000502000029000002d20020009c000002d2020080410000004002200210000002d20010009c000002d2010080410000006001100210000000000121019f00000b45000104300001000000000002000000000001004b00000b1b0000613d000000000200041a000000000012004b00000b1b0000a13d000100000001001d000000000010043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000b190000613d000000000101043b000000000101041a0000031f00100198000000010200002900000b1b0000c13d000000000001004b00000b180000c13d000000010220008a000100000002001d000000000020043f0000000401000039000000200010043f0000000001000414000002d20010009c000002d201008041000000c001100210000002e7011001c700008010020000390b430b3e0000040f000000010020019000000b190000613d000000000101043b000000000101041a000000000001004b000000010200002900000b050000613d000000000001042d000000000100001900000b4500010430000000400100043d0000033e020000410000000000210435000002d20010009c000002d201008041000000400110021000000325011001c700000b4500010430000000000001042f000002d20010009c000002d2010080410000004001100210000002d20020009c000002d2020080410000006002200210000000000112019f0000000002000414000002d20020009c000002d202008041000000c002200210000000000112019f000002e1011001c700008010020000390b430b3e0000040f000000010020019000000b370000613d000000000101043b000000000001042d000000000100001900000b450001043000000b3c002104210000000102000039000000000001042d0000000002000019000000000001042d00000b41002104230000000102000039000000000001042d0000000002000019000000000001042d00000b430000043200000b440001042e00000b45000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffbf5577550000000000000000000000000000000000000000000000000000000000bfa87805ed57dc1f0d489ce33be4c4577d74ccde357eeeee058a32c55c44a532405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acebfa87805ed57dc1f0d489ce33be4c4577d74ccde357eeeee058a32c55c44a5313da8a5f161a6c3ff06a60736d0ed24d7963cc6a5c4fafd2fa1dae9bb908e07a5c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b3da8a5f161a6c3ff06a60736d0ed24d7963cc6a5c4fafd2fa1dae9bb908e07a4ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000000000000000000000000000000000000000000000000859500338e00091eabfe8e493f369f48e58fdf2609ff8809506ce57440a6f25fddc25308a38516e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af91eabfe8e493f369f48e58fdf2609ff8809506ce57440a6f25fddc25308a38500200000000000000000000000000000000000040000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000002000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000020000000000000000000000000000004000000100000000000000000064647265737300000000000000000000000000000000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f206108c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000000000000000000000715018a500000000000000000000000000000000000000000000000000000000c051e38900000000000000000000000000000000000000000000000000000000de95416f00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f4c4456900000000000000000000000000000000000000000000000000000000de95417000000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000c051e38a00000000000000000000000000000000000000000000000000000000c50497ae00000000000000000000000000000000000000000000000000000000c87b56dd00000000000000000000000000000000000000000000000000000000a0bcfc7e00000000000000000000000000000000000000000000000000000000b88d4fdd00000000000000000000000000000000000000000000000000000000b88d4fde00000000000000000000000000000000000000000000000000000000bf8fbbd200000000000000000000000000000000000000000000000000000000a0bcfc7f00000000000000000000000000000000000000000000000000000000a22cb46500000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000002db115430000000000000000000000000000000000000000000000000000000051cff8d8000000000000000000000000000000000000000000000000000000006352211d000000000000000000000000000000000000000000000000000000006352211e0000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000051cff8d90000000000000000000000000000000000000000000000000000000059c74f29000000000000000000000000000000000000000000000000000000002db11544000000000000000000000000000000000000000000000000000000003708b2dd0000000000000000000000000000000000000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000095ea7b20000000000000000000000000000000000000000000000000000000018160ddc0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000013ae602c0000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000081812fc4368616e676520616d6f756e74000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000000000000000000000000000000000000000008400000080000000000000000000000000000000000000000000000000000000200000000000000000000000004e657720737570706c79206d757374206265206c6f776572206f7220657175616c20746f2063757272656e7420737570706c7900000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30000000000000000000000000000000000000000000000000000000000000002e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffdfa14c4b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000020000000000000000000000000000000000002000000000000000000000000017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31000000000000000000000000000000000000000000000000ffffffffffffff7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000640000000000000000000000008f4eb6040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3902000002000000000000000000000000000000240000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000005472616e73666572206661696c65642e0000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000012e07630000000000000000000000000000000000000000000000000000000000b562e8dd00000000000000000000000000000000000000000000000000000000536f6c64206f75740000000000000000000000000000000000000000000000004c696d6974207065722077616c6c6574000000000000000000000000000000004e6f7420656e6f75676820455448000000000000000000000000000000000000436c6f73656400000000000000000000000000000000000000000000000000004e6577207072696365206d757374206265206c6f776572206f7220657175616c20746f2063757272656e74207072696365000000000000000000000000000000cfb3b942000000000000000000000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925df2d9b4200000000000000000000000000000000000000000000000000000000cf4700e40000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000005b5e139f0000000000000000000000000000000000000000000000000000000080ac58cd00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffe00000000000000000000000000000000000000000000000010000000000000000a11481000000000000000000000000000000000000000000000000000000000059c896be00000000000000000000000000000000000000000000000000000000ea553b34000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83150b7a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe0d1a57ed600000000000000000000000000000000000000000000000000000000f971d0009f08918c35d5b211f92701e835b5a6042efd7fe03c2f569459c08c8c
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000860e323312dd0c320a72e9375e180ba614eb504f000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f7577756574682e78797a2f6d657461646174612f00000000
-----Decoded View---------------
Arg [0] : _baseUri (string): https://uwueth.xyz/metadata/
Arg [1] : initialOwner (address): 0x860E323312dd0C320A72E9375e180BA614eB504f
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000860e323312dd0c320a72e9375e180ba614eb504f
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [3] : 68747470733a2f2f7577756574682e78797a2f6d657461646174612f00000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.54
Net Worth in ETH
0.000184
Token Allocations
HYPE
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| HYPEREVM | 100.00% | $23.17 | 0.0235 | $0.544378 |
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.