ERC-721
Overview
Max Total Supply
2,100 FEWRASS
Holders
55
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FEWRASSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FirstEditionWrasslers
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /* . . . .cxxo. ;dxxo:cdxxdxxxxxo::dxxc. .ldxxxdxxxxxo' 'oxxxxxxxxxxxl. .cdxxl. .ldxxxxxxo::dxxxxxxxxo:cdxxxxxxxxxd:. . . .OMMX; .dNMMXkONMMMMMMMMXkONMMM0' ;0WMMMWMMWMWKc'cKWMMMMMMMMMW0; ,kWMW0; ;0WMMMMMMXkONMMMMMMMWXkONMMMMMMMMMNx' . . .OMMX; .,,,. ;OWMW0kKWMWXXWMMW0k0WMMMM0'.oXMWXdcccccc:''xNMWWKocccccc:. .cKWMNx. .oXMMXxcccldKWMWXXWWMW0k0WMWOlcccccc;. . . .OMMX: ;ONWWk. .lXWMNOkXWMN0KNWMNOkXWWMMWM0lkWMMW0occcccc,:0WWWNXOlcccccc. .xNMWKc. 'kWMW0; .lXWMNKKNWWXxxXWMMXxcccccc:. . . .OMMX: .oXMMMMO. 'kWMWKk0NMMWNNWMWKk0NMW0ONMM0kXMMMMMMMMMMMWOkWMMMMWMMMMMMMWl.:0WMWk' .cKWMWk' 'kWMMMNNWMW0:'kMMMMMMMMMMMMX; . . .OMMX:,kWMMMMMO,cKWMNOkKWMMMMMMWXOkKWMNx':XMM0ooxxxxxxONMMMNocdxxxxxxx0WMMMXodXMMXo. .xNMMMW0kxclKWMMMMMMWXx. .cxxxxxxkKWMMWO' . . .OMMN0KWMNNWMMX0NMWXkONMMKx0WMM0okNMMKl. ;XMM0:',,. 'xNMWKc..','. ,OWMWKk0WMW0; ;0WMMWWWWXkONMWKxOWMMO;.'''. .cKWMNx' . . .OMMMMMWKloNMMMMMW0kKWMWO, lNMMXXWMWO, ;XMM0kKNNk';0WMWk, lXNNo..lKWMNOkXMMNd. .oXMMXd:::cdKWMWO, cNMMx.oNNNo .dNMMXl. . . .OMMMMWO, :NMMWWXkkXWMXo. lNMMMMMXo. ;XMM0kNMMXOXMWXo. oWMWK0KNMWKkONWMWXdllll;;kWMMWKdlllxXMMXo. cNMWx'dWMW0ollo0WMWO, . . .OMMMXo. :NMMWKk0WMW0; lNMMWW0; ;XMM0kNMMMMMW0; oWMMMMMMN0kKWMMMMMMMMNOkXWMMMMMMMMMMMW0; cNMMx'dWMMMMMMMMWXo. . . .:ooo, .looc;:oooc. 'ooool. .looc:loooooc. ,ooooooo:;coooooooooo:;loooooooooooooc. 'loo;.,oooooooooo; . . .*/ import "@rari-capital/solmate/src/tokens/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import {ERC721EnumerableEssential} from "../Libraries/ERC721EnumerableEssential.sol"; import {SignedAllowance} from "../Libraries/SignedAllowance.sol"; contract FirstEditionWrasslers is ERC721, Ownable, SignedAllowance, ERC721EnumerableEssential { using Strings for uint256; uint256 public constant MAX_SUPPLY = 2100; uint256 public nextTokenId; string public baseUri; address public draftVault; address public p2mVault; address public auctionVault; struct Claim { uint256 tokenId; bytes signature; address minter; } constructor() ERC721("First Edition Wrasslers", "FEWRASS") { draftVault = msg.sender; _setAllowancesSigner(msg.sender); ++nextTokenId; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(baseUri).length > 0 ? string(abi.encodePacked(baseUri, tokenId.toString())) : ""; } /** * @notice Signed allowance disbursement based on L2 data * @dev Each of the mint paths depends on Layer 2 data that * assigns a tokenId to a minter address. Card packs, P2M * and public auctions all emit TokenAssigned events that * our off-chain infrastructure handles by creating signatures * and submitting transactions to transfer tokens to their assigned * owner address. */ function claimMultiple(Claim[] memory claims) external { uint256 l = claims.length; for (uint256 i = 0; i < l; ) { Claim memory c = claims[i]; _useAllowance(c.minter, c.tokenId, c.signature); _ownerOf[c.tokenId] = c.minter; emit Transfer(draftVault, c.minter, c.tokenId); unchecked { _balanceOf[c.minter] += l; i++; } } } function transferFrom( address from, address to, uint256 id ) public override { _beforeTokenTransfer(from, to, id); ERC721.transferFrom(from, to, id); } /** * @notice Admin function for minting tokens to draftPool EOA * @dev We want to provide mint pass holders transparency into * mintable tokens. When we "mint" to our draftPool, we perform * the bare minimum to ensure popular marketplaces index the * new tokens. We save gas by not writing to storage at all. */ function mintToPool(uint256 count) external { // Indexers prefer mint events where Transfer#to == msg.sender // to prevent spam. Only callable by destination EOA which // is different from contract owner require(msg.sender == draftVault, "Admin Only"); require(nextTokenId + count - 1 <= MAX_SUPPLY); uint256 nextLoopId = nextTokenId + count; for (uint256 id = nextTokenId; id < nextLoopId; ) { emit Transfer(address(0), msg.sender, id); unchecked { ++id; } } _tokenCounter += count; nextTokenId = nextLoopId; } /// @notice sets allowance signer, this can be used to revoke all unused allowances already out there /// @param newSigner the new signer function setAllowancesSigner(address newSigner) external onlyOwner { _setAllowancesSigner(newSigner); } function setDraftVault(address _draftVault) external onlyOwner { draftVault = _draftVault; } function setBaseURI(string calldata _uri) external onlyOwner { baseUri = _uri; } function ownerOf(uint256 tokenId) public view override returns (address) { address owner = _ownerOf[tokenId]; if (owner == address(0) && tokenId < nextTokenId) { return draftVault; } require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } function _exists(uint256 tokenId) internal view returns (bool) { require(tokenId > 0, "ERC721: owner query for nonexistent token"); return tokenId < nextTokenId; } function supportsInterface(bytes4 interfaceId) public view override(ERC721) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// 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/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@rari-capital/solmate/src/tokens/ERC721.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability ONLY FOR token ids owned by each account as an alternative to OZ. * The ineffecient totalSupply is replaced with a simple counter. */ abstract contract ERC721EnumerableEssential is ERC721 { // Mapping from owner to indexed list of owned token IDs mapping(address => mapping(uint256 => uint256)) internal _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; uint256 internal _tokenCounter; /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _tokenCounter; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual { if (from != to) { if (to == address(0)) { --_tokenCounter; } else { // _addTokenToOwnerEnumeration(to, tokenId); } if (from == address(0)) { ++_tokenCounter; } else { // _removeTokenFromOwnerEnumeration(from, tokenId); } } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /// @title SignedAllowance /// @author Simon Fremaux (@dievardump) contract SignedAllowance { using ECDSA for bytes32; // list of already used allowances mapping(bytes32 => bool) public usedAllowances; // address used to sign the allowances address private _allowancesSigner; /// @notice Helper to know allowancesSigner address /// @return the allowance signer address function allowancesSigner() public view virtual returns (address) { return _allowancesSigner; } /// @notice Helper that creates the message that signer needs to sign to allow a mint /// this is usually also used when creating the allowances, to ensure "message" /// is the same /// @param account the account to allow /// @param nonce the nonce /// @param _for contract address where the allowance can be used /// @return the message to sign function createMessage( address account, uint256 nonce, address _for ) public pure returns (bytes32) { return keccak256(abi.encode(account, nonce, _for)); } /// @notice Helper that creates a list of messages that signer needs to sign to allow mintings /// @param accounts the accounts to allow /// @param nonces the corresponding nonces /// @return messages the messages to sign function createMessages( address[] memory accounts, uint256[] memory nonces, address _for ) internal pure returns (bytes32[] memory messages) { require(accounts.length == nonces.length, "!LENGTH_MISMATCH!"); messages = new bytes32[](accounts.length); for (uint256 i; i < accounts.length; i++) { messages[i] = createMessage(accounts[i], nonces[i], _for); } } /// @notice This function verifies that the current request is valid /// @dev It ensures that _allowancesSigner signed a message containing (account, nonce, address(this)) /// and that this message was not already used /// @param account the account the allowance is associated to /// @param nonce the nonce associated to this allowance /// @param signature the signature by the allowance signer wallet /// @return bool whether the signature is valid function validateSignature( address account, uint256 nonce, bytes memory signature ) external view returns (bool) { _validateSignature(account, nonce, signature); return true; } /// @dev It ensures that signer signed a message containing (account, nonce, address(this)) /// and that this message was not already used /// @param account the account the allowance is associated to /// @param nonce the nonce associated to this allowance /// @param signature the signature by the allowance signer wallet /// @return the message to mark as used function _validateSignature( address account, uint256 nonce, bytes memory signature ) internal view returns (bytes32) { bytes32 message = createMessage(account, nonce, address(this)).toEthSignedMessageHash(); require(message.recover(signature) == allowancesSigner(), "!INVALID_SIGNATURE!"); require(usedAllowances[message] == false, "!ALREADY_USED!"); return message; } /// @notice internal function that verifies an allowance and marks it as used /// this function throws if signature is wrong or this nonce for this user has already been used /// @param account the account the allowance is associated to /// @param nonce the nonce /// @param signature the signature by the allowance wallet function _useAllowance( address account, uint256 nonce, bytes memory signature ) internal { bytes32 message = _validateSignature(account, nonce, signature); usedAllowances[message] = true; } /// @notice Allows to change the allowance signer. This can be used to revoke any signed allowance not already used /// @param newSigner the new signer address function _setAllowancesSigner(address newSigner) internal { _allowancesSigner = newSigner; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowancesSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"minter","type":"address"}],"internalType":"struct FirstEditionWrasslers.Claim[]","name":"claims","type":"tuple[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"_for","type":"address"}],"name":"createMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"draftVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"p2mVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setAllowancesSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_draftVault","type":"address"}],"name":"setDraftVault","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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedAllowances","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601781526020017f46697273742045646974696f6e2057726173736c657273000000000000000000815250604051806040016040528060078152602001664645575241535360c81b8152508160009081620000799190620001dd565b506001620000888282620001dd565b505050620000a56200009f620000e260201b60201c565b620000e6565b600e8054336001600160a01b03199182168117909255600880549091169091179055600c60008154620000d890620002a9565b90915550620002d1565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200016357607f821691505b6020821081036200018457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001d857600081815260208120601f850160051c81016020861015620001b35750805b601f850160051c820191505b81811015620001d457828155600101620001bf565b5050505b505050565b81516001600160401b03811115620001f957620001f962000138565b62000211816200020a84546200014e565b846200018a565b602080601f831160018114620002495760008415620002305750858301515b600019600386901b1c1916600185901b178555620001d4565b600085815260208120601f198616915b828110156200027a5788860151825594840194600190910190840162000259565b5085821015620002995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201620002ca57634e487b7160e01b600052601160045260246000fd5b5060010190565b61202d80620002e16000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a5780639abc8320116100ad578063da90491b1161007c578063da90491b14610431578063ddb5d05f14610444578063e985e9c514610457578063eaa626c914610485578063f2fde38b1461049857600080fd5b80639abc8320146103f0578063a22cb465146103f8578063b88d4fde1461040b578063c87b56dd1461041e57600080fd5b80638838b5c3116100e95780638838b5c3146103b3578063890621da146103c45780638da5cb5b146103d757806395d89b41146103e857600080fd5b80636352211e1461037c57806370a082311461038f578063715018a6146103a257806375794a3c146103aa57600080fd5b806323b872dd1161019257806348a220a41161016157806348a220a41461033057806355298d4c1461034357806355f804b31461035657806358f3fc811461036957600080fd5b806323b872dd146102ee5780632f745c591461030157806332cb6b0c1461031457806342842e0e1461031d57600080fd5b806318160ddd116101ce57806318160ddd14610293578063195e8708146102a55780631ab89524146102c85780632073447d146102db57600080fd5b806301ffc9a71461020057806306fdde0314610228578063081812fc1461023d578063095ea7b31461027e575b600080fd5b61021361020e36600461174b565b6104ab565b60405190151581526020015b60405180910390f35b6102306104bc565b60405161021f9190611793565b61026661024b3660046117c6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b61029161028c3660046117fb565b61054a565b005b600b545b60405190815260200161021f565b6102136102b33660046117c6565b60076020526000908152604090205460ff1681565b6102916102d6366004611825565b610631565b6102916102e9366004611825565b61067d565b6102916102fc366004611840565b6106c8565b61029761030f3660046117fb565b6106e3565b61029761083481565b61029161032b366004611840565b610779565b601054610266906001600160a01b031681565b61029161035136600461195c565b61086c565b610291610364366004611ab0565b61093c565b600e54610266906001600160a01b031681565b61026661038a3660046117c6565b610973565b61029761039d366004611825565b6109d8565b610291610a3b565b610297600c5481565b6008546001600160a01b0316610266565b6102136103d2366004611af2565b610a71565b6006546001600160a01b0316610266565b610230610a89565b610230610a96565b610291610406366004611b49565b610aa3565b610291610419366004611b85565b610b0f565b61023061042c3660046117c6565b610bf7565b600f54610266906001600160a01b031681565b6102916104523660046117c6565b610cc2565b610213610465366004611bf4565b600560209081526000928352604080842090915290825290205460ff1681565b610297610493366004611c27565b610da5565b6102916104a6366004611825565b610dec565b60006104b682610e84565b92915050565b600080546104c990611c63565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590611c63565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061059357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105d55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b0316331461065b5760405162461bcd60e51b81526004016105cc90611c9d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146106a75760405162461bcd60e51b81526004016105cc90611c9d565b600880546001600160a01b0319166001600160a01b03831617905550565b50565b6106d3838383610ed2565b6106de838383610f33565b505050565b60006106ee836109d8565b82106107505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105cc565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6107848383836106c8565b6001600160a01b0382163b158061082d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190611cd2565b6001600160e01b031916145b6106de5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b805160005b818110156106de57600083828151811061088d5761088d611cef565b602002602001015190506108ae8160400151826000015183602001516110fa565b6040818101805183516000908152600260205283812080546001600160a01b0319166001600160a01b0393841617905584519251600e5494519394908316939216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a46040908101516001600160a01b03166000908152600360205220805483019055600101610871565b6006546001600160a01b031633146109665760405162461bcd60e51b81526004016105cc90611c9d565b600d6106de828483611d53565b6000818152600260205260408120546001600160a01b03168015801561099a5750600c5483105b156109b2575050600e546001600160a01b0316919050565b6001600160a01b0381166104b65760405162461bcd60e51b81526004016105cc90611e13565b60006001600160a01b038216610a1f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016105cc565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a655760405162461bcd60e51b81526004016105cc90611c9d565b610a6f6000611126565b565b6000610a7e848484611178565b506001949350505050565b600180546104c990611c63565b600d80546104c990611c63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b1a8585856106c8565b6001600160a01b0384163b1580610bb15750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610b629033908a90899089908990600401611e5c565b6020604051808303816000875af1158015610b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba59190611cd2565b6001600160e01b031916145b610bf05760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b5050505050565b6060610c02826112a7565b610c665760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105cc565b6000600d8054610c7590611c63565b905011610c9157604051806020016040528060008152506104b6565b600d610c9c836112d0565b604051602001610cad929190611eb0565b60405160208183030381529060405292915050565b600e546001600160a01b03163314610d095760405162461bcd60e51b815260206004820152600a60248201526941646d696e204f6e6c7960b01b60448201526064016105cc565b610834600182600c54610d1c9190611f4d565b610d269190611f60565b1115610d3157600080fd5b600081600c54610d419190611f4d565b600c549091505b81811015610d8757604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610d48565b5081600b6000828254610d9a9190611f4d565b9091555050600c5550565b604080516001600160a01b03808616602083015291810184905290821660608201526000906080016040516020818303038152906040528051906020012090509392505050565b6006546001600160a01b03163314610e165760405162461bcd60e51b81526004016105cc90611c9d565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cc565b6106c581611126565b60006301ffc9a760e01b6001600160e01b031983161480610eb557506380ac58cd60e01b6001600160e01b03198316145b806104b65750506001600160e01b031916635b5e139f60e01b1490565b816001600160a01b0316836001600160a01b0316146106de576001600160a01b038216610f0d57600b60008154610f0890611f73565b909155505b6001600160a01b0383166106de57600b60008154610f2a90611f8a565b90915550505050565b6000818152600260205260409020546001600160a01b03848116911614610f895760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016105cc565b6001600160a01b038216610fd35760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016105cc565b336001600160a01b038416148061100d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061102e57506000818152600460205260409020546001600160a01b031633145b61106b5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016105cc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611107848484611178565b6000908152600760205260409020805460ff1916600117905550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111dc611189868630610da5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506111f06008546001600160a01b031690565b6001600160a01b031661120382856113d1565b6001600160a01b03161461124f5760405162461bcd60e51b815260206004820152601360248201527221494e56414c49445f5349474e41545552452160681b60448201526064016105cc565b60008181526007602052604090205460ff161561129f5760405162461bcd60e51b815260206004820152600e60248201526d21414c52454144595f555345442160901b60448201526064016105cc565b949350505050565b60008082116112c85760405162461bcd60e51b81526004016105cc90611e13565b50600c541190565b6060816000036112f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611321578061130b81611f8a565b915061131a9050600a83611fb9565b91506112fb565b60008167ffffffffffffffff81111561133c5761133c61187c565b6040519080825280601f01601f191660200182016040528015611366576020820181803683370190505b5090505b841561129f5761137b600183611f60565b9150611388600a86611fcd565b611393906030611f4d565b60f81b8183815181106113a8576113a8611cef565b60200101906001600160f81b031916908160001a9053506113ca600a86611fb9565b945061136a565b60008060006113e085856113f5565b915091506113ed81611463565b509392505050565b600080825160410361142b5760208301516040840151606085015160001a61141f87828585611619565b9450945050505061145c565b82516040036114545760208301516040840151611449868383611706565b93509350505061145c565b506000905060025b9250929050565b600081600481111561147757611477611fe1565b0361147f5750565b600181600481111561149357611493611fe1565b036114e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105cc565b60028160048111156114f4576114f4611fe1565b036115415760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105cc565b600381600481111561155557611555611fe1565b036115ad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105cc565b60048160048111156115c1576115c1611fe1565b036106c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105cc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561165057506000905060036116fd565b8460ff16601b1415801561166857508460ff16601c14155b1561167957506000905060046116fd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156116cd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116f6576000600192509250506116fd565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161172787828885611619565b935093505050935093915050565b6001600160e01b0319811681146106c557600080fd5b60006020828403121561175d57600080fd5b813561176881611735565b9392505050565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6000602082840312156117d857600080fd5b5035919050565b80356001600160a01b03811681146117f657600080fd5b919050565b6000806040838503121561180e57600080fd5b611817836117df565b946020939093013593505050565b60006020828403121561183757600080fd5b611768826117df565b60008060006060848603121561185557600080fd5b61185e846117df565b925061186c602085016117df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118b5576118b561187c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e4576118e461187c565b604052919050565b600082601f8301126118fd57600080fd5b813567ffffffffffffffff8111156119175761191761187c565b61192a601f8201601f19166020016118bb565b81815284602083860101111561193f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561196f57600080fd5b823567ffffffffffffffff8082111561198757600080fd5b818501915085601f83011261199b57600080fd5b8135818111156119ad576119ad61187c565b8060051b6119bc8582016118bb565b91825283810185019185810190898411156119d657600080fd5b86860192505b83831015611a61578235858111156119f45760008081fd5b86016060818c03601f1901811315611a0c5760008081fd5b611a14611892565b89830135815260408084013589811115611a2e5760008081fd5b611a3c8f8d838801016118ec565b8c84015250611a4c8385016117df565b908201528452505091860191908601906119dc565b9998505050505050505050565b60008083601f840112611a8057600080fd5b50813567ffffffffffffffff811115611a9857600080fd5b60208301915083602082850101111561145c57600080fd5b60008060208385031215611ac357600080fd5b823567ffffffffffffffff811115611ada57600080fd5b611ae685828601611a6e565b90969095509350505050565b600080600060608486031215611b0757600080fd5b611b10846117df565b925060208401359150604084013567ffffffffffffffff811115611b3357600080fd5b611b3f868287016118ec565b9150509250925092565b60008060408385031215611b5c57600080fd5b611b65836117df565b915060208301358015158114611b7a57600080fd5b809150509250929050565b600080600080600060808688031215611b9d57600080fd5b611ba6866117df565b9450611bb4602087016117df565b935060408601359250606086013567ffffffffffffffff811115611bd757600080fd5b611be388828901611a6e565b969995985093965092949392505050565b60008060408385031215611c0757600080fd5b611c10836117df565b9150611c1e602084016117df565b90509250929050565b600080600060608486031215611c3c57600080fd5b611c45846117df565b925060208401359150611c5a604085016117df565b90509250925092565b600181811c90821680611c7757607f821691505b602082108103611c9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ce457600080fd5b815161176881611735565b634e487b7160e01b600052603260045260246000fd5b601f8211156106de57600081815260208120601f850160051c81016020861015611d2c5750805b601f850160051c820191505b81811015611d4b57828155600101611d38565b505050505050565b67ffffffffffffffff831115611d6b57611d6b61187c565b611d7f83611d798354611c63565b83611d05565b6000601f841160018114611db35760008515611d9b5750838201355b600019600387901b1c1916600186901b178355610bf0565b600083815260209020601f19861690835b82811015611de45786850135825560209485019460019092019101611dc4565b5086821015611e015760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808454611ebe81611c63565b60018281168015611ed65760018114611eeb57611f1a565b60ff1984168752821515830287019450611f1a565b8860005260208060002060005b85811015611f115781548a820152908401908201611ef8565b50505082870194505b505050508351611f2e81836020880161176f565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104b6576104b6611f37565b818103818111156104b6576104b6611f37565b600081611f8257611f82611f37565b506000190190565b600060018201611f9c57611f9c611f37565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611fc857611fc8611fa3565b500490565b600082611fdc57611fdc611fa3565b500690565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220713c3817947c5737245e9f5df623445290a859dd719ad16f2c277d9977070ef064736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a5780639abc8320116100ad578063da90491b1161007c578063da90491b14610431578063ddb5d05f14610444578063e985e9c514610457578063eaa626c914610485578063f2fde38b1461049857600080fd5b80639abc8320146103f0578063a22cb465146103f8578063b88d4fde1461040b578063c87b56dd1461041e57600080fd5b80638838b5c3116100e95780638838b5c3146103b3578063890621da146103c45780638da5cb5b146103d757806395d89b41146103e857600080fd5b80636352211e1461037c57806370a082311461038f578063715018a6146103a257806375794a3c146103aa57600080fd5b806323b872dd1161019257806348a220a41161016157806348a220a41461033057806355298d4c1461034357806355f804b31461035657806358f3fc811461036957600080fd5b806323b872dd146102ee5780632f745c591461030157806332cb6b0c1461031457806342842e0e1461031d57600080fd5b806318160ddd116101ce57806318160ddd14610293578063195e8708146102a55780631ab89524146102c85780632073447d146102db57600080fd5b806301ffc9a71461020057806306fdde0314610228578063081812fc1461023d578063095ea7b31461027e575b600080fd5b61021361020e36600461174b565b6104ab565b60405190151581526020015b60405180910390f35b6102306104bc565b60405161021f9190611793565b61026661024b3660046117c6565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b61029161028c3660046117fb565b61054a565b005b600b545b60405190815260200161021f565b6102136102b33660046117c6565b60076020526000908152604090205460ff1681565b6102916102d6366004611825565b610631565b6102916102e9366004611825565b61067d565b6102916102fc366004611840565b6106c8565b61029761030f3660046117fb565b6106e3565b61029761083481565b61029161032b366004611840565b610779565b601054610266906001600160a01b031681565b61029161035136600461195c565b61086c565b610291610364366004611ab0565b61093c565b600e54610266906001600160a01b031681565b61026661038a3660046117c6565b610973565b61029761039d366004611825565b6109d8565b610291610a3b565b610297600c5481565b6008546001600160a01b0316610266565b6102136103d2366004611af2565b610a71565b6006546001600160a01b0316610266565b610230610a89565b610230610a96565b610291610406366004611b49565b610aa3565b610291610419366004611b85565b610b0f565b61023061042c3660046117c6565b610bf7565b600f54610266906001600160a01b031681565b6102916104523660046117c6565b610cc2565b610213610465366004611bf4565b600560209081526000928352604080842090915290825290205460ff1681565b610297610493366004611c27565b610da5565b6102916104a6366004611825565b610dec565b60006104b682610e84565b92915050565b600080546104c990611c63565b80601f01602080910402602001604051908101604052809291908181526020018280546104f590611c63565b80156105425780601f1061051757610100808354040283529160200191610542565b820191906000526020600020905b81548152906001019060200180831161052557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061059357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6105d55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b0316331461065b5760405162461bcd60e51b81526004016105cc90611c9d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031633146106a75760405162461bcd60e51b81526004016105cc90611c9d565b600880546001600160a01b0319166001600160a01b03831617905550565b50565b6106d3838383610ed2565b6106de838383610f33565b505050565b60006106ee836109d8565b82106107505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105cc565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6107848383836106c8565b6001600160a01b0382163b158061082d5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190611cd2565b6001600160e01b031916145b6106de5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b805160005b818110156106de57600083828151811061088d5761088d611cef565b602002602001015190506108ae8160400151826000015183602001516110fa565b6040818101805183516000908152600260205283812080546001600160a01b0319166001600160a01b0393841617905584519251600e5494519394908316939216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a46040908101516001600160a01b03166000908152600360205220805483019055600101610871565b6006546001600160a01b031633146109665760405162461bcd60e51b81526004016105cc90611c9d565b600d6106de828483611d53565b6000818152600260205260408120546001600160a01b03168015801561099a5750600c5483105b156109b2575050600e546001600160a01b0316919050565b6001600160a01b0381166104b65760405162461bcd60e51b81526004016105cc90611e13565b60006001600160a01b038216610a1f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016105cc565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610a655760405162461bcd60e51b81526004016105cc90611c9d565b610a6f6000611126565b565b6000610a7e848484611178565b506001949350505050565b600180546104c990611c63565b600d80546104c990611c63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b1a8585856106c8565b6001600160a01b0384163b1580610bb15750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610b629033908a90899089908990600401611e5c565b6020604051808303816000875af1158015610b81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba59190611cd2565b6001600160e01b031916145b610bf05760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016105cc565b5050505050565b6060610c02826112a7565b610c665760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105cc565b6000600d8054610c7590611c63565b905011610c9157604051806020016040528060008152506104b6565b600d610c9c836112d0565b604051602001610cad929190611eb0565b60405160208183030381529060405292915050565b600e546001600160a01b03163314610d095760405162461bcd60e51b815260206004820152600a60248201526941646d696e204f6e6c7960b01b60448201526064016105cc565b610834600182600c54610d1c9190611f4d565b610d269190611f60565b1115610d3157600080fd5b600081600c54610d419190611f4d565b600c549091505b81811015610d8757604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610d48565b5081600b6000828254610d9a9190611f4d565b9091555050600c5550565b604080516001600160a01b03808616602083015291810184905290821660608201526000906080016040516020818303038152906040528051906020012090509392505050565b6006546001600160a01b03163314610e165760405162461bcd60e51b81526004016105cc90611c9d565b6001600160a01b038116610e7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cc565b6106c581611126565b60006301ffc9a760e01b6001600160e01b031983161480610eb557506380ac58cd60e01b6001600160e01b03198316145b806104b65750506001600160e01b031916635b5e139f60e01b1490565b816001600160a01b0316836001600160a01b0316146106de576001600160a01b038216610f0d57600b60008154610f0890611f73565b909155505b6001600160a01b0383166106de57600b60008154610f2a90611f8a565b90915550505050565b6000818152600260205260409020546001600160a01b03848116911614610f895760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016105cc565b6001600160a01b038216610fd35760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016105cc565b336001600160a01b038416148061100d57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061102e57506000818152600460205260409020546001600160a01b031633145b61106b5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016105cc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611107848484611178565b6000908152600760205260409020805460ff1916600117905550505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806111dc611189868630610da5565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506111f06008546001600160a01b031690565b6001600160a01b031661120382856113d1565b6001600160a01b03161461124f5760405162461bcd60e51b815260206004820152601360248201527221494e56414c49445f5349474e41545552452160681b60448201526064016105cc565b60008181526007602052604090205460ff161561129f5760405162461bcd60e51b815260206004820152600e60248201526d21414c52454144595f555345442160901b60448201526064016105cc565b949350505050565b60008082116112c85760405162461bcd60e51b81526004016105cc90611e13565b50600c541190565b6060816000036112f75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611321578061130b81611f8a565b915061131a9050600a83611fb9565b91506112fb565b60008167ffffffffffffffff81111561133c5761133c61187c565b6040519080825280601f01601f191660200182016040528015611366576020820181803683370190505b5090505b841561129f5761137b600183611f60565b9150611388600a86611fcd565b611393906030611f4d565b60f81b8183815181106113a8576113a8611cef565b60200101906001600160f81b031916908160001a9053506113ca600a86611fb9565b945061136a565b60008060006113e085856113f5565b915091506113ed81611463565b509392505050565b600080825160410361142b5760208301516040840151606085015160001a61141f87828585611619565b9450945050505061145c565b82516040036114545760208301516040840151611449868383611706565b93509350505061145c565b506000905060025b9250929050565b600081600481111561147757611477611fe1565b0361147f5750565b600181600481111561149357611493611fe1565b036114e05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105cc565b60028160048111156114f4576114f4611fe1565b036115415760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105cc565b600381600481111561155557611555611fe1565b036115ad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105cc565b60048160048111156115c1576115c1611fe1565b036106c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105cc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561165057506000905060036116fd565b8460ff16601b1415801561166857508460ff16601c14155b1561167957506000905060046116fd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156116cd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116f6576000600192509250506116fd565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161172787828885611619565b935093505050935093915050565b6001600160e01b0319811681146106c557600080fd5b60006020828403121561175d57600080fd5b813561176881611735565b9392505050565b60005b8381101561178a578181015183820152602001611772565b50506000910152565b60208152600082518060208401526117b281604085016020870161176f565b601f01601f19169190910160400192915050565b6000602082840312156117d857600080fd5b5035919050565b80356001600160a01b03811681146117f657600080fd5b919050565b6000806040838503121561180e57600080fd5b611817836117df565b946020939093013593505050565b60006020828403121561183757600080fd5b611768826117df565b60008060006060848603121561185557600080fd5b61185e846117df565b925061186c602085016117df565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118b5576118b561187c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156118e4576118e461187c565b604052919050565b600082601f8301126118fd57600080fd5b813567ffffffffffffffff8111156119175761191761187c565b61192a601f8201601f19166020016118bb565b81815284602083860101111561193f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561196f57600080fd5b823567ffffffffffffffff8082111561198757600080fd5b818501915085601f83011261199b57600080fd5b8135818111156119ad576119ad61187c565b8060051b6119bc8582016118bb565b91825283810185019185810190898411156119d657600080fd5b86860192505b83831015611a61578235858111156119f45760008081fd5b86016060818c03601f1901811315611a0c5760008081fd5b611a14611892565b89830135815260408084013589811115611a2e5760008081fd5b611a3c8f8d838801016118ec565b8c84015250611a4c8385016117df565b908201528452505091860191908601906119dc565b9998505050505050505050565b60008083601f840112611a8057600080fd5b50813567ffffffffffffffff811115611a9857600080fd5b60208301915083602082850101111561145c57600080fd5b60008060208385031215611ac357600080fd5b823567ffffffffffffffff811115611ada57600080fd5b611ae685828601611a6e565b90969095509350505050565b600080600060608486031215611b0757600080fd5b611b10846117df565b925060208401359150604084013567ffffffffffffffff811115611b3357600080fd5b611b3f868287016118ec565b9150509250925092565b60008060408385031215611b5c57600080fd5b611b65836117df565b915060208301358015158114611b7a57600080fd5b809150509250929050565b600080600080600060808688031215611b9d57600080fd5b611ba6866117df565b9450611bb4602087016117df565b935060408601359250606086013567ffffffffffffffff811115611bd757600080fd5b611be388828901611a6e565b969995985093965092949392505050565b60008060408385031215611c0757600080fd5b611c10836117df565b9150611c1e602084016117df565b90509250929050565b600080600060608486031215611c3c57600080fd5b611c45846117df565b925060208401359150611c5a604085016117df565b90509250925092565b600181811c90821680611c7757607f821691505b602082108103611c9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611ce457600080fd5b815161176881611735565b634e487b7160e01b600052603260045260246000fd5b601f8211156106de57600081815260208120601f850160051c81016020861015611d2c5750805b601f850160051c820191505b81811015611d4b57828155600101611d38565b505050505050565b67ffffffffffffffff831115611d6b57611d6b61187c565b611d7f83611d798354611c63565b83611d05565b6000601f841160018114611db35760008515611d9b5750838201355b600019600387901b1c1916600186901b178355610bf0565b600083815260209020601f19861690835b82811015611de45786850135825560209485019460019092019101611dc4565b5086821015611e015760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000808454611ebe81611c63565b60018281168015611ed65760018114611eeb57611f1a565b60ff1984168752821515830287019450611f1a565b8860005260208060002060005b85811015611f115781548a820152908401908201611ef8565b50505082870194505b505050508351611f2e81836020880161176f565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104b6576104b6611f37565b818103818111156104b6576104b6611f37565b600081611f8257611f82611f37565b506000190190565b600060018201611f9c57611f9c611f37565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611fc857611fc8611fa3565b500490565b600082611fdc57611fdc611fa3565b500690565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220713c3817947c5737245e9f5df623445290a859dd719ad16f2c277d9977070ef064736f6c63430008110033
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.