Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
123 WXMINU
Holders
6
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WrappedXminu
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC20.sol"; import "./SudoInu.sol"; contract WrappedXminu is ERC20 { uint256 DECIMAL_MULTIPLIER = 1e18; SudoInu public immutable XMINU; event NFTDeposit(address indexed from, address indexed to, uint256 indexed amount); event NFTWithdrawal(address indexed from, address indexed to, uint256 indexed amount); constructor(SudoInu _xminu) ERC20("Wrapped Sudo Inu", "WXMINU", 18) { XMINU = _xminu; } function deposit(address to, uint256[] calldata nftIds) public { for (uint256 i; i < nftIds.length; ) { XMINU.transferFrom(msg.sender, address(this), nftIds[i]); unchecked { ++i; } } _mint(to, nftIds.length * DECIMAL_MULTIPLIER); emit NFTDeposit(msg.sender, to, nftIds.length); } function withdraw(address to, uint256[] calldata nftIds) public { for (uint256 i; i < nftIds.length; ) { XMINU.transferFrom(address(this), to, nftIds[i]); unchecked { ++i; } } _burn(msg.sender, nftIds.length * DECIMAL_MULTIPLIER); emit NFTWithdrawal(msg.sender, to, nftIds.length); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; import "./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 { // Reference type for token approval. 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 ? baseURI : ''; } /** * @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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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 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 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 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`. ) 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 0x80 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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 pragma solidity ^0.8.4; import "./ERC721A.sol"; contract SudoInu is ERC721A { bool minted; constructor() ERC721A("Sudo Inu", "XMINU") {} function _baseURI() internal view virtual override returns (string memory) { return "ipfs://QmUL5WAgCYMZZ714mi6LayiWiEA8dCAWD5o4Sm2gpJx6cj"; } function mint() external payable { require(!minted, "Mint already completed"); _mint(msg.sender, 1000); minted = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract SudoInu","name":"_xminu","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","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":"amount","type":"uint256"}],"name":"NFTDeposit","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":"amount","type":"uint256"}],"name":"NFTWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"XMINU","outputs":[{"internalType":"contract SudoInu","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052670de0b6b3a76400006006553480156200001e57600080fd5b506040516200129338038062001293833981016040819052620000419162000248565b604080518082018252601081526f57726170706564205375646f20496e7560801b60208083019182528351808501909452600684526557584d494e5560d01b9084015281519192916012916200009b9160009190620001a2565b508151620000b1906001906020850190620001a2565b507fff0000000000000000000000000000000000000000000000000000000000000060f882901b166080524660a052620000ea62000106565b60c05250505060601b6001600160601b03191660e05262000358565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516200013a919062000278565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b828054620001b0906200031b565b90600052602060002090601f016020900481019282620001d457600085556200021f565b82601f10620001ef57805160ff19168380011785556200021f565b828001600101855582156200021f579182015b828111156200021f57825182559160200191906001019062000202565b506200022d92915062000231565b5090565b5b808211156200022d576000815560010162000232565b6000602082840312156200025a578081fd5b81516001600160a01b038116811462000271578182fd5b9392505050565b600080835482600182811c9150808316806200029557607f831692505b6020808410821415620002b657634e487b7160e01b87526022600452602487fd5b818015620002cd5760018114620002df576200030d565b60ff198616895284890196506200030d565b60008a815260209020885b86811015620003055781548b820152908501908301620002ea565b505084890196505b509498975050505050505050565b600181811c908216806200033057607f821691505b602082108114156200035257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160f81c60a05160c05160e05160601c610eed620003a660003960008181610140015281816104e80152610621015260006104b901526000610484015260006101a90152610eed6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a71604e811610066578063a71604e814610242578063a9059cbb14610255578063d505accf14610268578063dd62ed3e1461027b57600080fd5b806370a08231146101e55780637ecebe00146102055780638293744b1461022557806395d89b411461023a57600080fd5b806318160ddd116100d357806318160ddd1461017a57806323b872dd14610191578063313ce567146101a45780633644e515146101dd57600080fd5b806306fdde03146100fa578063095ea7b3146101185780630cdd004f1461013b575b600080fd5b6101026102a6565b60405161010f9190610da5565b60405180910390f35b61012b610126366004610ce1565b610334565b604051901515815260200161010f565b6101627f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161010f565b61018360025481565b60405190815260200161010f565b61012b61019f366004610bb4565b6103a0565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161010f565b610183610480565b6101836101f3366004610b61565b60036020526000908152604090205481565b610183610213366004610b61565b60056020526000908152604090205481565b610238610233366004610c60565b6104db565b005b610102610607565b610238610250366004610c60565b610614565b61012b610263366004610ce1565b610740565b610238610276366004610bef565b6107a6565b610183610289366004610b82565b600460209081526000928352604080842090915290825290205481565b600080546102b390610e46565b80601f01602080910402602001604051908101604052809291908181526020018280546102df90610e46565b801561032c5780601f106103015761010080835404028352916020019161032c565b820191906000526020600020905b81548152906001019060200180831161030f57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061038f9086815260200190565b60405180910390a350600192915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146103fc576103d78382610e2f565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610424908490610e2f565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020610e988339815191529061046d9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104b6576104b16109ef565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60005b818110156105b1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd308686868681811061053757634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561058e57600080fd5b505af11580156105a2573d6000803e3d6000fd5b505050508060010190506104de565b506006546105ca9033906105c59084610e10565b610a89565b60405181906001600160a01b0385169033907fa1920ca3dcbadb104b1787fec71b1c291adec85a372ad7b6800af7d56144759290600090a4505050565b600180546102b390610e46565b60005b818110156106ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd333086868681811061067057634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156106c757600080fd5b505af11580156106db573d6000803e3d6000fd5b50505050806001019050610617565b506006546107039084906106fe9084610e10565b610af3565b60405181906001600160a01b0385169033907f6beb9379af630d855c59b605909537f26c1d38ef62bc6645e8741985d890fdb090600090a4505050565b33600090815260036020526040812080548391908390610761908490610e2f565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020610e988339815191529061038f9086815260200190565b428410156107fb5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b60006001610807610480565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610913573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109495750876001600160a01b0316816001600160a01b0316145b6109865760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107f2565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610a219190610d0a565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821660009081526003602052604081208054839290610ab1908490610e2f565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020610e98833981519152906020015b60405180910390a35050565b8060026000828254610b059190610df8565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020610e988339815191529101610ae7565b80356001600160a01b0381168114610b5c57600080fd5b919050565b600060208284031215610b72578081fd5b610b7b82610b45565b9392505050565b60008060408385031215610b94578081fd5b610b9d83610b45565b9150610bab60208401610b45565b90509250929050565b600080600060608486031215610bc8578081fd5b610bd184610b45565b9250610bdf60208501610b45565b9150604084013590509250925092565b600080600080600080600060e0888a031215610c09578283fd5b610c1288610b45565b9650610c2060208901610b45565b95506040880135945060608801359350608088013560ff81168114610c43578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080600060408486031215610c74578283fd5b610c7d84610b45565b9250602084013567ffffffffffffffff80821115610c99578384fd5b818601915086601f830112610cac578384fd5b813581811115610cba578485fd5b8760208260051b8501011115610cce578485fd5b6020830194508093505050509250925092565b60008060408385031215610cf3578182fd5b610cfc83610b45565b946020939093013593505050565b600080835482600182811c915080831680610d2657607f831692505b6020808410821415610d4657634e487b7160e01b87526022600452602487fd5b818015610d5a5760018114610d6b57610d97565b60ff19861689528489019650610d97565b60008a815260209020885b86811015610d8f5781548b820152908501908301610d76565b505084890196505b509498975050505050505050565b6000602080835283518082850152825b81811015610dd157858101830151858201604001528201610db5565b81811115610de25783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e0b57610e0b610e81565b500190565b6000816000190483118215151615610e2a57610e2a610e81565b500290565b600082821015610e4157610e41610e81565b500390565b600181811c90821680610e5a57607f821691505b60208210811415610e7b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a14aa106506aba33b620d2b559df2fa9658cfc0b6e5382b9a6bfe10c5e75b0b764736f6c63430008040033000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f20
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a71604e811610066578063a71604e814610242578063a9059cbb14610255578063d505accf14610268578063dd62ed3e1461027b57600080fd5b806370a08231146101e55780637ecebe00146102055780638293744b1461022557806395d89b411461023a57600080fd5b806318160ddd116100d357806318160ddd1461017a57806323b872dd14610191578063313ce567146101a45780633644e515146101dd57600080fd5b806306fdde03146100fa578063095ea7b3146101185780630cdd004f1461013b575b600080fd5b6101026102a6565b60405161010f9190610da5565b60405180910390f35b61012b610126366004610ce1565b610334565b604051901515815260200161010f565b6101627f000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f2081565b6040516001600160a01b03909116815260200161010f565b61018360025481565b60405190815260200161010f565b61012b61019f366004610bb4565b6103a0565b6101cb7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161010f565b610183610480565b6101836101f3366004610b61565b60036020526000908152604090205481565b610183610213366004610b61565b60056020526000908152604090205481565b610238610233366004610c60565b6104db565b005b610102610607565b610238610250366004610c60565b610614565b61012b610263366004610ce1565b610740565b610238610276366004610bef565b6107a6565b610183610289366004610b82565b600460209081526000928352604080842090915290825290205481565b600080546102b390610e46565b80601f01602080910402602001604051908101604052809291908181526020018280546102df90610e46565b801561032c5780601f106103015761010080835404028352916020019161032c565b820191906000526020600020905b81548152906001019060200180831161030f57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061038f9086815260200190565b60405180910390a350600192915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146103fc576103d78382610e2f565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610424908490610e2f565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020610e988339815191529061046d9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146104b6576104b16109ef565b905090565b507f734657170571370e88baefbfd8607df4cfe3070db58087b0bddce90c80a70c5b90565b60005b818110156105b1577f000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f206001600160a01b03166323b872dd308686868681811061053757634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561058e57600080fd5b505af11580156105a2573d6000803e3d6000fd5b505050508060010190506104de565b506006546105ca9033906105c59084610e10565b610a89565b60405181906001600160a01b0385169033907fa1920ca3dcbadb104b1787fec71b1c291adec85a372ad7b6800af7d56144759290600090a4505050565b600180546102b390610e46565b60005b818110156106ea577f000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f206001600160a01b03166323b872dd333086868681811061067057634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156106c757600080fd5b505af11580156106db573d6000803e3d6000fd5b50505050806001019050610617565b506006546107039084906106fe9084610e10565b610af3565b60405181906001600160a01b0385169033907f6beb9379af630d855c59b605909537f26c1d38ef62bc6645e8741985d890fdb090600090a4505050565b33600090815260036020526040812080548391908390610761908490610e2f565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020610e988339815191529061038f9086815260200190565b428410156107fb5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b60006001610807610480565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610913573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109495750876001600160a01b0316816001600160a01b0316145b6109865760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107f2565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610a219190610d0a565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821660009081526003602052604081208054839290610ab1908490610e2f565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020610e98833981519152906020015b60405180910390a35050565b8060026000828254610b059190610df8565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020610e988339815191529101610ae7565b80356001600160a01b0381168114610b5c57600080fd5b919050565b600060208284031215610b72578081fd5b610b7b82610b45565b9392505050565b60008060408385031215610b94578081fd5b610b9d83610b45565b9150610bab60208401610b45565b90509250929050565b600080600060608486031215610bc8578081fd5b610bd184610b45565b9250610bdf60208501610b45565b9150604084013590509250925092565b600080600080600080600060e0888a031215610c09578283fd5b610c1288610b45565b9650610c2060208901610b45565b95506040880135945060608801359350608088013560ff81168114610c43578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080600060408486031215610c74578283fd5b610c7d84610b45565b9250602084013567ffffffffffffffff80821115610c99578384fd5b818601915086601f830112610cac578384fd5b813581811115610cba578485fd5b8760208260051b8501011115610cce578485fd5b6020830194508093505050509250925092565b60008060408385031215610cf3578182fd5b610cfc83610b45565b946020939093013593505050565b600080835482600182811c915080831680610d2657607f831692505b6020808410821415610d4657634e487b7160e01b87526022600452602487fd5b818015610d5a5760018114610d6b57610d97565b60ff19861689528489019650610d97565b60008a815260209020885b86811015610d8f5781548b820152908501908301610d76565b505084890196505b509498975050505050505050565b6000602080835283518082850152825b81811015610dd157858101830151858201604001528201610db5565b81811115610de25783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e0b57610e0b610e81565b500190565b6000816000190483118215151615610e2a57610e2a610e81565b500290565b600082821015610e4157610e41610e81565b500390565b600181811c90821680610e5a57607f821691505b60208210811415610e7b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a14aa106506aba33b620d2b559df2fa9658cfc0b6e5382b9a6bfe10c5e75b0b764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f20
-----Decoded View---------------
Arg [0] : _xminu (address): 0xA78c124B4F7368adDE6a74D32eD9C369fe016F20
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a78c124b4f7368adde6a74d32ed9c369fe016f20
Deployed Bytecode Sourcemap
105:1162:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1031:18:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2461:211;;;;;;:::i;:::-;;:::i;:::-;;;4797:14:5;;4790:22;4772:41;;4760:2;4745:18;2461:211:0;4727:92:5;183:30:4;;;;;;;;-1:-1:-1;;;;;6679:32:5;;;6661:51;;6649:2;6634:18;183:30:4;6616:102:5;1304:26:0;;;;;;;;;4970:25:5;;;4958:2;4943:18;1304:26:0;4925:76:5;3057:592:0;;;;;;:::i;:::-;;:::i;1083:31::-;;;;;;;;8380:4:5;8368:17;;;8350:36;;8338:2;8323:18;1083:31:0;8305:87:5;5327:177:0;;;:::i;1337:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1751:41;;;;;;:::i;:::-;;;;;;;;;;;;;;891:374:4;;;;;;:::i;:::-;;:::i;:::-;;1056:20:0;;;:::i;505:380:4:-;;;;;;:::i;:::-;;:::i;2678:373:0:-;;;;;;:::i;:::-;;:::i;3838:1483::-;;;;;;:::i;:::-;;:::i;1388:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1031:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2461:211::-;2561:10;2535:4;2551:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2551:30:0;;;;;;;;;;:39;;;2606:37;2535:4;;2551:30;;2606:37;;;;2584:6;4970:25:5;;4958:2;4943:18;;4925:76;2606:37:0;;;;;;;;-1:-1:-1;2661:4:0;2461:211;;;;:::o;3057:592::-;-1:-1:-1;;;;;3209:15:0;;3175:4;3209:15;;;:9;:15;;;;;;;;3225:10;3209:27;;;;;;;;-1:-1:-1;;3287:28:0;;3283:80;;3347:16;3357:6;3347:7;:16;:::i;:::-;-1:-1:-1;;;;;3317:15:0;;;;;;:9;:15;;;;;;;;3333:10;3317:27;;;;;;;:46;3283:80;-1:-1:-1;;;;;3374:15:0;;;;;;:9;:15;;;;;:25;;3393:6;;3374:15;:25;;3393:6;;3374:25;:::i;:::-;;;;-1:-1:-1;;;;;;;3545:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;3594:26;3545:13;;3594:26;;;-1:-1:-1;;;;;;;;;;;3594:26:0;;;3562:6;4970:25:5;;4958:2;4943:18;;4925:76;3594:26:0;;;;;;;;-1:-1:-1;3638:4:0;;3057:592;-1:-1:-1;;;;3057:592:0:o;5327:177::-;5384:7;5427:16;5410:13;:33;:87;;5473:24;:22;:24::i;:::-;5403:94;;5327:177;:::o;5410:87::-;-1:-1:-1;5446:24:0;;5327:177::o;891:374:4:-;970:9;965:170;981:17;;;965:170;;;1016:5;-1:-1:-1;;;;;1016:18:4;;1043:4;1050:2;1054:6;;1061:1;1054:9;;;;;-1:-1:-1;;;1054:9:4;;;;;;;;;1016:48;;-1:-1:-1;;;;;;1016:48:4;;;;;;;-1:-1:-1;;;;;4510:15:5;;;1016:48:4;;;4492:34:5;4562:15;;;;4542:18;;;4535:43;-1:-1:-1;1054:9:4;;;;;;4594:18:5;;;4587:34;4427:18;;1016:48:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:3;;;;;965:170;;;-1:-1:-1;1179:18:4;;1145:53;;1151:10;;1163:34;;:6;:34;:::i;:::-;1145:5;:53::i;:::-;1214:44;;1244:6;;-1:-1:-1;;;;;1214:44:4;;;1228:10;;1214:44;;;;;891:374;;;:::o;1056:20:0:-;;;;;;;:::i;505:380:4:-;591:9;586:178;602:17;;;586:178;;;637:5;-1:-1:-1;;;;;637:18:4;;656:10;676:4;683:6;;690:1;683:9;;;;;-1:-1:-1;;;683:9:4;;;;;;;;;637:56;;-1:-1:-1;;;;;;637:56:4;;;;;;;-1:-1:-1;;;;;4510:15:5;;;637:56:4;;;4492:34:5;4562:15;;;;4542:18;;;4535:43;-1:-1:-1;683:9:4;;;;;;4594:18:5;;;4587:34;4427:18;;637:56:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;736:3;;;;;586:178;;;-1:-1:-1;800:18:4;;774:45;;780:2;;784:34;;:6;:34;:::i;:::-;774:5;:45::i;:::-;838:41;;865:6;;-1:-1:-1;;;;;838:41:4;;;849:10;;838:41;;;;;505:380;;;:::o;2678:373:0:-;2774:10;2748:4;2764:21;;;:9;:21;;;;;:31;;2789:6;;2764:21;2748:4;;2764:31;;2789:6;;2764:31;:::i;:::-;;;;-1:-1:-1;;;;;;;2941:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;2990:32;2999:10;;-1:-1:-1;;;;;;;;;;;2990:32:0;;;2958:6;4970:25:5;;4958:2;4943:18;;4925:76;3838:1483:0;4057:15;4045:8;:27;;4037:63;;;;-1:-1:-1;;;4037:63:0;;7876:2:5;4037:63:0;;;7858:21:5;7915:2;7895:18;;;7888:30;7954:25;7934:18;;;7927:53;7997:18;;4037:63:0;;;;;;;;;4265:24;4292:805;4428:18;:16;:18::i;:::-;-1:-1:-1;;;;;4873:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4511:449;;4555:165;4511:449;;;5293:25:5;5372:18;;;5365:43;;;;5444:15;;;5424:18;;;5417:43;5476:18;;;5469:34;;;5519:19;;;5512:35;;;;5563:19;;;;5556:35;;;4511:449:0;;;;;;;;;;5265:19:5;;;4511:449:0;;;4472:514;;;;;;;;-1:-1:-1;;;4350:658:0;;;4113:27:5;4156:11;;;4149:27;;;;4192:12;;;4185:28;;;;4229:12;;4350:658:0;;;-1:-1:-1;;4350:658:0;;;;;;;;;4319:707;;4350:658;4319:707;;;;4292:805;;;;;;;;;6323:25:5;6396:4;6384:17;;6364:18;;;6357:45;6418:18;;;6411:34;;;6461:18;;;6454:34;;;6295:19;;4292:805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4292:805:0;;-1:-1:-1;;4292:805:0;;;-1:-1:-1;;;;;;;5120:30:0;;;;;;:59;;;5174:5;-1:-1:-1;;;;;5154:25:0;:16;-1:-1:-1;;;;;5154:25:0;;5120:59;5112:86;;;;-1:-1:-1;;;5112:86:0;;7533:2:5;5112:86:0;;;7515:21:5;7572:2;7552:18;;;7545:30;-1:-1:-1;;;7591:18:5;;;7584:44;7645:18;;5112:86:0;7505:164:5;5112:86:0;-1:-1:-1;;;;;5213:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5283:31;4970:25:5;;;5213:36:0;;5283:31;;;;;4943:18:5;5283:31:0;;;;;;;3838:1483;;;;;;;:::o;5510:446::-;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;5861:25:5;;;;5902:18;;5895:34;;;;5833:14:0;5945:18:5;;;5938:34;5869:13:0;5988:18:5;;;5981:34;5912:4:0;6031:19:5;;;6024:61;5833:19;;5640:295:0;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;6481:328::-;-1:-1:-1;;;;;6553:15:0;;;;;;:9;:15;;;;;:25;;6572:6;;6553:15;:25;;6572:6;;6553:25;:::i;:::-;;;;-1:-1:-1;;6721:11:0;:21;;;;;;;6768:34;;4970:25:5;;;-1:-1:-1;;;;;;;6768:34:0;;;-1:-1:-1;;;;;;;;;;;6768:34:0;4958:2:5;4943:18;6768:34:0;;;;;;;;6481:328;;:::o;6150:325::-;6235:6;6220:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6387:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;6436:32;4970:25:5;;;-1:-1:-1;;;;;;;;;;;6436:32:0;4943:18:5;6436:32:0;4925:76:5;14:173;82:20;;-1:-1:-1;;;;;131:31:5;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;:::-;343:39;262:126;-1:-1:-1;;;262:126:5:o;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:713::-;1122:6;1130;1138;1146;1154;1162;1170;1223:3;1211:9;1202:7;1198:23;1194:33;1191:2;;;1245:6;1237;1230:22;1191:2;1273:29;1292:9;1273:29;:::i;:::-;1263:39;;1321:38;1355:2;1344:9;1340:18;1321:38;:::i;:::-;1311:48;;1406:2;1395:9;1391:18;1378:32;1368:42;;1457:2;1446:9;1442:18;1429:32;1419:42;;1511:3;1500:9;1496:19;1483:33;1556:4;1549:5;1545:16;1538:5;1535:27;1525:2;;1581:6;1573;1566:22;1525:2;1181:543;;;;-1:-1:-1;1181:543:5;;;;1609:5;1661:3;1646:19;;1633:33;;-1:-1:-1;1713:3:5;1698:19;;;1685:33;;1181:543;-1:-1:-1;;1181:543:5:o;1729:739::-;1824:6;1832;1840;1893:2;1881:9;1872:7;1868:23;1864:32;1861:2;;;1914:6;1906;1899:22;1861:2;1942:29;1961:9;1942:29;:::i;:::-;1932:39;;2022:2;2011:9;2007:18;1994:32;2045:18;2086:2;2078:6;2075:14;2072:2;;;2107:6;2099;2092:22;2072:2;2150:6;2139:9;2135:22;2125:32;;2195:7;2188:4;2184:2;2180:13;2176:27;2166:2;;2222:6;2214;2207:22;2166:2;2267;2254:16;2293:2;2285:6;2282:14;2279:2;;;2314:6;2306;2299:22;2279:2;2372:7;2367:2;2357:6;2354:1;2350:14;2346:2;2342:23;2338:32;2335:45;2332:2;;;2398:6;2390;2383:22;2332:2;2434;2430;2426:11;2416:21;;2456:6;2446:16;;;;;1851:617;;;;;:::o;2473:264::-;2541:6;2549;2602:2;2590:9;2581:7;2577:23;2573:32;2570:2;;;2623:6;2615;2608:22;2570:2;2651:29;2670:9;2651:29;:::i;:::-;2641:39;2727:2;2712:18;;;;2699:32;;-1:-1:-1;;;2560:177:5:o;2742:1108::-;2872:3;2901;2936:6;2930:13;2966:3;2988:1;3016:9;3012:2;3008:18;2998:28;;3076:2;3065:9;3061:18;3098;3088:2;;3142:4;3134:6;3130:17;3120:27;;3088:2;3168;3216;3208:6;3205:14;3185:18;3182:38;3179:2;;;-1:-1:-1;;;3243:33:5;;3299:4;3296:1;3289:15;3329:4;3250:3;3317:17;3179:2;3360:18;3387:104;;;;3505:1;3500:325;;;;3353:472;;3387:104;-1:-1:-1;;3420:24:5;;3408:37;;3465:16;;;;-1:-1:-1;3387:104:5;;3500:325;8447:4;8466:17;;;8516:4;8500:21;;3598:3;3614:165;3628:6;3625:1;3622:13;3614:165;;;3706:14;;3693:11;;;3686:35;3749:16;;;;3643:10;;3614:165;;;3618:3;;3808:6;3803:3;3799:16;3792:23;;3353:472;-1:-1:-1;3841:3:5;;2880:970;-1:-1:-1;;;;;;;;2880:970:5:o;6723:603::-;6835:4;6864:2;6893;6882:9;6875:21;6925:6;6919:13;6968:6;6963:2;6952:9;6948:18;6941:34;6993:4;7006:140;7020:6;7017:1;7014:13;7006:140;;;7115:14;;;7111:23;;7105:30;7081:17;;;7100:2;7077:26;7070:66;7035:10;;7006:140;;;7164:6;7161:1;7158:13;7155:2;;;7234:4;7229:2;7220:6;7209:9;7205:22;7201:31;7194:45;7155:2;-1:-1:-1;7310:2:5;7289:15;-1:-1:-1;;7285:29:5;7270:45;;;;7317:2;7266:54;;6844:482;-1:-1:-1;;;6844:482:5:o;8532:128::-;8572:3;8603:1;8599:6;8596:1;8593:13;8590:2;;;8609:18;;:::i;:::-;-1:-1:-1;8645:9:5;;8580:80::o;8665:168::-;8705:7;8771:1;8767;8763:6;8759:14;8756:1;8753:21;8748:1;8741:9;8734:17;8730:45;8727:2;;;8778:18;;:::i;:::-;-1:-1:-1;8818:9:5;;8717:116::o;8838:125::-;8878:4;8906:1;8903;8900:8;8897:2;;;8911:18;;:::i;:::-;-1:-1:-1;8948:9:5;;8887:76::o;8968:380::-;9047:1;9043:12;;;;9090;;;9111:2;;9165:4;9157:6;9153:17;9143:27;;9111:2;9218;9210:6;9207:14;9187:18;9184:38;9181:2;;;9264:10;9259:3;9255:20;9252:1;9245:31;9299:4;9296:1;9289:15;9327:4;9324:1;9317:15;9181:2;;9023:325;;;:::o;9353:127::-;9414:10;9409:3;9405:20;9402:1;9395:31;9445:4;9442:1;9435:15;9469:4;9466:1;9459:15
Swarm Source
ipfs://a14aa106506aba33b620d2b559df2fa9658cfc0b6e5382b9a6bfe10c5e75b0b7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.