ERC-721
Overview
Max Total Supply
117 SCRAWL
Holders
72
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Scrawl
Compiler Version
v0.8.13+commit.abaa5c0e
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.13; import "./AnonymiceLibrary.sol"; import "solmate/tokens/ERC721.sol"; import "openzeppelin-contracts/access/Ownable.sol"; import "openzeppelin-contracts/utils/cryptography/MerkleProof.sol"; interface IScrawlArt { function scrawlArtCode() external view returns (string memory); } contract Scrawl is ERC721, Ownable { /* ββββββ ββββββ ββββββββ βββββ ββββ ββββ ββββββ β β β β β β β β β β ββ ββ β β β β β β ββ β β β βββββ βββββ β β β β β ββ β β ββ β ββ β β β β β ββββ βββββββ β β β ββ βββ ββ ββ βββββββββ β β β β β β β β β β β ββββββ ββββ βββ ββββββββ ββββββ ββββ βββ ββββββββ ββββββ ββββ ββββ βββββ ββββ ββ ββββ β β ββ β β ββ ββ β β β β β β β β β β ββ β β β β β β β β ββ ββ β β β β β β ββ βββββ β β β βββββ β β β β βββ ββββββ β β β β β βββββ β β ββ β βββ β β β β β ββ β β β β β β β ββ β β β β β ββββββ ββ ββ βββββββ β ββ ββββββ βββββββββ βββ ββ ββ β ββ ββ β ββ β β β β β β β ββ ββ β β β β β β β β β β β β β β β β β β β β β */ using AnonymiceLibrary for uint8; struct Trait { string traitName; string traitType; } struct HashNeeds { uint16 startHash; uint16 startNonce; } // address for p5 code stored in separate contract address public scrawlArt; //Mappings mapping(uint256 => Trait[]) public traitTypes; mapping(address => uint256) private lastWrite; //Mint Checks mapping(address => bool) addressCircSaleMinted; mapping(address => bool) addressFreelistMinted; mapping(address => bool) addressAllowlistMinted; uint256 public totalSupply = 0; //uint256s uint256 public constant MAX_SUPPLY = 420; uint256 public constant CIRCOLORS_PRESALE_COST = 0.0256 ether; uint256 public constant GENERAL_MINT_COST = 0.0365 ether; //public mint start timestamp uint256 public SALE_START; bool initStart = false; mapping(uint256 => HashNeeds) tokenIdToHashNeeds; uint16 SEED_NONCE = 0; //minting flag bool griffMinted = false; bool public MINTING_LIVE = false; //uint arrays uint16[][7] TIERS; //p5js url string p5jsUrl = "https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fp5.js%2F1.4.0%2Fp5.js"; string p5jsIntegrity = "sha256-maU2GxaUCz5WChkAGR40nt9sbWRPEfF8qo%2FprxhoKPQ%3D"; string animationUrl = "https://circolors.mypinata.cloud/ipfs/QmayAdMcP5QpWRcjf8W8hkcWLipLEMcNcm1XatTwLBP1zG?x="; string imageUrl = "https://scrawl-by-pixelwank.s3.amazonaws.com/output/"; bytes32 constant circPresaleRoot = 0xf18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f62; bytes32 constant freelistRoot = 0x246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd8; bytes32 constant generalMintlistRoot = 0xd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c2; constructor(address _scrawlArt) payable ERC721("SCRAWL", "SCRAWL") { scrawlArt = _scrawlArt; //Declare all the rarity tiers //Palettes TIERS[0] = [ 250, 500, 500, 500, 500, 750, 500, 250, 500, 500, 500, 250, 600, 750, 500, 500, 500, 250, 500, 500, 400 ]; //Bg TIERS[1] = [5500, 3500, 700, 300]; //Depth TIERS[2] = [1000, 3500, 5500]; //Passes TIERS[3] = [4200, 3300, 2000, 500]; //Tidy TIERS[4] = [5000, 5000]; //Shape TIERS[5] = [7500, 500, 700, 1300]; //Border TIERS[6] = [2500, 2000, 500, 5000]; } //prevents someone calling read functions the same block they mint modifier disallowIfStateIsChanging() { require( owner() == msg.sender || lastWrite[msg.sender] < block.number, "not so fast!" ); _; } /* __ __ __ __ __ ______ __ __ __ ______ /\ "-./ \ /\ \ /\ "-.\ \ /\__ _\ /\ \ /\ "-.\ \ /\ ___\ \ \ \-./\ \ \ \ \ \ \ \-. \ \/_/\ \/ \ \ \ \ \ \-. \ \ \ \__ \ \ \_\ \ \_\ \ \_\ \ \_\\"\_\ \ \_\ \ \_\ \ \_\\"\_\ \ \_____\ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_/ \/_____/ */ /** * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier. * @param _randinput The input from 0 - 10000 to use for rarity gen. * @param _rarityTier The tier to use. */ function rarityGen(uint256 _randinput, uint8 _rarityTier) internal view returns (uint8) { uint16 currentLowerBound = 0; uint256 length = TIERS[_rarityTier].length; for (uint8 i = 0; i < length; i++) { uint16 thisPercentage = TIERS[_rarityTier][i]; if ( _randinput >= currentLowerBound && _randinput < currentLowerBound + thisPercentage ) return i; currentLowerBound = currentLowerBound + thisPercentage; } revert(); } /** * @param _a The address to be used within the hash. */ function hash(address _a) internal view returns (uint16) { uint16 _randinput = uint16( uint256( keccak256( abi.encodePacked(block.timestamp, block.difficulty, _a) ) ) % 10000 ); return _randinput; } function buildHash(uint256 _t) internal view returns (string memory) { // This will generate a 8 character string. string memory currentHash = ""; uint256 rInput = tokenIdToHashNeeds[_t].startHash; uint256 _nonce = tokenIdToHashNeeds[_t].startNonce; for (uint8 i = 0; i < 7; i++) { ++_nonce; uint16 _randinput = uint16( uint256(keccak256(abi.encodePacked(rInput, _t, _nonce))) % 10000 ); if (i == 0) { uint8 rar = rarityGen(_randinput, i); if (rar > 9) { currentHash = string( abi.encodePacked(currentHash, rar.toString()) ); } else { currentHash = string( abi.encodePacked(currentHash, "0", rar.toString()) ); } } else { currentHash = string( abi.encodePacked( currentHash, rarityGen(_randinput, i).toString() ) ); } } return currentHash; } /** * @dev Mint internal, this is to avoid code duplication. */ function mintInternal() internal { require( MINTING_LIVE == true || msg.sender == owner(), "Minting not live" ); require(initStart, "Minting not begun"); require(block.timestamp < SALE_START + 72 hours, "Minting over"); uint256 thisTokenId = totalSupply; require(thisTokenId < MAX_SUPPLY, "Minted out"); tokenIdToHashNeeds[thisTokenId] = HashNeeds( hash(msg.sender), SEED_NONCE ); lastWrite[msg.sender] = block.number; SEED_NONCE += 8; _mint(msg.sender, thisTokenId); ++totalSupply; } function mintGriff() external { require(!griffMinted, "You already minted knobhead"); require(msg.sender == 0xdb4782d463628cc5b1de8f1220f755BA3bA4728E); uint256 firstId = totalSupply; require(firstId + 5 < MAX_SUPPLY, "Minted out"); for (uint256 i = 0; i < 5; i++) { tokenIdToHashNeeds[firstId + i] = HashNeeds( hash(msg.sender), SEED_NONCE ); SEED_NONCE += 8; _mint(msg.sender, firstId + i); } totalSupply += 5; griffMinted = true; } /** * @dev Mints new tokens. */ function mintCircolorsPresale( address account, bytes32[] calldata merkleProof ) external payable { // Check address is on the merkle root bytes32 node = keccak256(abi.encodePacked(account)); require( MerkleProof.verify(merkleProof, circPresaleRoot, node), "Not on Circolors Presale list" ); require(account == msg.sender, "Self mint only"); require(msg.value == CIRCOLORS_PRESALE_COST, "Mint is 0.0256eth"); require( addressCircSaleMinted[msg.sender] != true, "Address already minted presale" ); addressCircSaleMinted[msg.sender] = true; return mintInternal(); } function mintFreelist(address account, bytes32[] calldata merkleProof) external payable { bytes32 node = keccak256(abi.encodePacked(account)); require( MerkleProof.verify(merkleProof, freelistRoot, node), "Not on Free mint list" ); require(account == msg.sender, "Self mint only"); require( addressFreelistMinted[msg.sender] != true, "Address already free minted" ); addressFreelistMinted[msg.sender] = true; return mintInternal(); } function mintAllowlist(address account, bytes32[] calldata merkleProof) external payable { bytes32 node = keccak256(abi.encodePacked(account)); require( MerkleProof.verify(merkleProof, generalMintlistRoot, node), "Not on Allowlist" ); require(account == msg.sender, "Self mint only"); require(msg.value == GENERAL_MINT_COST, "Mint is 0.0365eth"); require( addressAllowlistMinted[msg.sender] != true, "Address already minted allow list" ); require( block.timestamp > SALE_START + 24 hours, "Allowlist mint not started yet" ); addressAllowlistMinted[msg.sender] = true; return mintInternal(); } function mintPublic() external payable { require(msg.value == GENERAL_MINT_COST, "Mint is 0.0365eth"); require( block.timestamp > SALE_START + 48 hours, "Public mint not started" ); return mintInternal(); } /* ______ ______ ______ _____ __ __ __ ______ /\ == \ /\ ___\ /\ __ \ /\ __-. /\ \ /\ "-.\ \ /\ ___\ \ \ __< \ \ __\ \ \ __ \ \ \ \/\ \ \ \ \ \ \ \-. \ \ \ \__ \ \ \_\ \_\ \ \_____\ \ \_\ \_\ \ \____- \ \_\ \ \_\\"\_\ \ \_____\ \/_/ /_/ \/_____/ \/_/\/_/ \/____/ \/_/ \/_/ \/_/ \/_____/ */ function allowlistStart() external view returns (uint256) { require(initStart, "Mint start not initiated yet"); return SALE_START + 24 hours; } function generalSaleStart() external view returns (uint256) { require(initStart, "Mint start not initiated yet"); return SALE_START + 48 hours; } function mintDeadline() public view returns (uint256) { require(initStart, "Mint start not initiated yet"); return SALE_START + 72 hours; } /** * @dev Hash to HTML function */ function hashToHTML(string memory _hash, uint256 _tokenId) external view disallowIfStateIsChanging returns (string memory) { string memory htmlString = string( abi.encodePacked( "data:text/html,%3Chtml%3E%3Chead%3E%3Cscript%20src%3D%22", p5jsUrl, "%22%20integrity%3D%22", p5jsIntegrity, "%22%20crossorigin%3D%22anonymous%22%3E%0A%3C%2Fscript%3E%0A%3Cstyle%3E%0Abody%20%7B%0A%20%20margin%3A%200%3B%0A%20%20padding%3A%200%3B%0A%20%20background%3A%20%23000%3B%0A%20%20overflow%3A%20hidden%3B%0A%7D%0A%0A%23fs%20%7B%0A%20%20position%3A%20fixed%3B%0A%20%20top%3A%200%3B%0A%20%20right%3A%200%3B%0A%20%20bottom%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20background-color%3A%20black%3B%0A%20%20display%3A%20flex%3B%0A%20%20justify-content%3A%20center%3B%0A%20%20align-items%3A%20center%3B%0A%7D%0A%0A%23fs%20canvas%20%7B%0A%20%20object-fit%3A%20contain%3B%0A%20%20max-height%3A%20100%25%3B%0A%20%20max-width%3A%20100%25%3B%0A%7D%0A%3C%2Fstyle%3E%3C%2Fhead%3E%3Cbody%3E%3Cdiv%20id%3D%22fs%22%3E%3C%2Fdiv%3E%3Cscript%3Evar%20tI%3D", AnonymiceLibrary.toString(_tokenId), "%3Bvar%20h%3D%22", _hash, "%22%3B" ) ); string memory artCode = IScrawlArt(scrawlArt).scrawlArtCode(); htmlString = string(abi.encodePacked(htmlString, artCode)); return htmlString; } /** * @dev Hash to metadata function */ function hashToMetadata(string memory _hash) public view disallowIfStateIsChanging returns (string memory) { string memory metadataString; uint8 paletteTraitIndex = AnonymiceLibrary.parseInt( AnonymiceLibrary.substring(_hash, 0, 2) ); metadataString = string( abi.encodePacked( metadataString, '{"trait_type":"', traitTypes[0][paletteTraitIndex].traitType, '","value":"', traitTypes[0][paletteTraitIndex].traitName, '"},' ) ); for (uint8 i = 2; i < 7; i++) { uint8 thisTraitIndex = AnonymiceLibrary.parseInt( AnonymiceLibrary.substring(_hash, i, i + 1) ); metadataString = string( abi.encodePacked( metadataString, '{"trait_type":"', traitTypes[i][thisTraitIndex].traitType, '","value":"', traitTypes[i][thisTraitIndex].traitName, '"}' ) ); if (i != 6) metadataString = string(abi.encodePacked(metadataString, ",")); } return string(abi.encodePacked("[", metadataString, "]")); } /** * @dev Returns the image and metadata for a token Id * @param _tokenId The tokenId to return the image and metadata for. */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_tokenId < totalSupply, "non existant id"); string memory tokenHash = _tokenIdToHash(_tokenId); string memory description = '", "description": "420 SCRAWL pieces by pixelwank x Circolors. Traits generated on chain & metadata, images mirrored on chain permanently.",'; string memory encodedTokenId = AnonymiceLibrary.encode( bytes(string(abi.encodePacked(AnonymiceLibrary.toString(_tokenId)))) ); string memory encodedHash = AnonymiceLibrary.encode( bytes(string(abi.encodePacked(tokenHash))) ); return string( abi.encodePacked( "data:application/json;base64,", AnonymiceLibrary.encode( bytes( string( abi.encodePacked( '{"name": "SCRAWL #', AnonymiceLibrary.toString(_tokenId), description, '"animation_url":"', animationUrl, encodedTokenId, "&t=", encodedHash, '","image":"', imageUrl, AnonymiceLibrary.toString(_tokenId), '.png","attributes":', hashToMetadata(tokenHash), "}" ) ) ) ) ) ); } /** * @dev Returns a hash for a given tokenId * @param _tokenId The tokenId to return the hash for. */ function _tokenIdToHash(uint256 _tokenId) public view disallowIfStateIsChanging returns (string memory) { require(_tokenId < totalSupply, "non existant id"); string memory tokenHash = buildHash(_tokenId); return tokenHash; } /* ______ __ __ __ __ ______ ______ /\ __ \ /\ \ _ \ \ /\ "-.\ \ /\ ___\ /\ == \ \ \ \/\ \ \ \ \/ ".\ \ \ \ \-. \ \ \ __\ \ \ __< \ \_____\ \ \__/".~\_\ \ \_\\"\_\ \ \_____\ \ \_\ \_\ \/_____/ \/_/ \/_/ \/_/ \/_/ \/_____/ \/_/ /_/ /** * @dev Add a trait type * @param _traitTypeIndex The trait type index * @param traits Array of traits to add */ function addTraitType(uint256 _traitTypeIndex, Trait[] calldata traits) external payable onlyOwner { for (uint256 i = 0; i < traits.length; i++) { traitTypes[_traitTypeIndex].push( Trait(traits[i].traitName, traits[i].traitType) ); } return; } function initStartTimes() external onlyOwner { require(!initStart, "mint time already started"); SALE_START = block.timestamp; MINTING_LIVE = true; initStart = true; } function flipMintingSwitch() external payable onlyOwner { MINTING_LIVE = !MINTING_LIVE; } /** * @dev Sets the p5js url * @param _p5jsUrl The address of the p5js file hosted on CDN */ function setJsAddress(string memory _p5jsUrl) external payable onlyOwner { p5jsUrl = _p5jsUrl; } /** * @dev Sets the p5js resource integrity * @param _p5jsIntegrity The hash of the p5js file (to protect w subresource integrity) */ function setJsIntegrity(string memory _p5jsIntegrity) external payable onlyOwner { p5jsIntegrity = _p5jsIntegrity; } /** * @dev Sets the base image url * @param _imageUrl The base url for image field */ function setImageUrl(string memory _imageUrl) external payable onlyOwner { imageUrl = _imageUrl; } function setAnimationUrl(string memory _animationUrl) external payable onlyOwner { animationUrl = _animationUrl; } function withdraw() external payable onlyOwner { uint256 sixty = (address(this).balance / 100) * 60; uint256 twentyFive = (address(this).balance / 100) * 25; uint256 ten = (address(this).balance / 100) * 10; uint256 five = (address(this).balance / 100) * 5; (bool sentT, ) = payable( address(0xE4260Df86f5261A41D19c2066f1Eb2Eb4F009e84) ).call{value: twentyFive}(""); require(sentT, "Failed to send"); (bool sentI, ) = payable( address(0x4533d1F65906368ebfd61259dAee561DF3f3559D) ).call{value: ten}(""); require(sentI, "Failed to send"); (bool sentC, ) = payable( address(0x888f8AA938dbb18b28bdD111fa4A0D3B8e10C871) ).call{value: five}(""); require(sentC, "Failed to send"); (bool sentG, ) = payable( address(0xdb4782d463628cc5b1de8f1220f755BA3bA4728E) ).call{value: sixty}(""); require(sentG, "Failed to send"); } }
pragma solidity ^0.8.0; library AnonymiceLibrary { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { 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); } function parseInt(string memory _a) internal pure returns (uint8 _parsedInt) { bytes memory bresult = bytes(_a); uint8 mint = 0; for (uint8 i = 0; i < bresult.length; i++) { if ( (uint8(uint8(bresult[i])) >= 48) && (uint8(uint8(bresult[i])) <= 57) ) { mint *= 10; mint += uint8(bresult[i]) - 48; } } return mint; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
// 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/transmissions11/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/transmissions11/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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// 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; } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", "solmate/=lib/solmate/src/", "src/=src/", "test/=test/", "script/=script/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_scrawlArt","type":"address"}],"stateMutability":"payable","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":"CIRCOLORS_PRESALE_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENERAL_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTING_LIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"internalType":"struct Scrawl.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintingSwitch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"generalSaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToHTML","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initStartTimes","outputs":[],"stateMutability":"nonpayable","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":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintCircolorsPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintFreelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintGriff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","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":[],"name":"scrawlArt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_animationUrl","type":"string"}],"name":"setAnimationUrl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageUrl","type":"string"}],"name":"setImageUrl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsUrl","type":"string"}],"name":"setJsAddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsIntegrity","type":"string"}],"name":"setJsIntegrity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"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":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6000600d55600f805460ff191690556011805463ffffffff1916905561010060405260486080818152906200454160a03980516200004691601991602090910190620003e6565b506040518060600160405280603781526020016200450a6037913980516200007791601a91602090910190620003e6565b50604051806080016040528060578152602001620045bd605791398051620000a891601b91602090910190620003e6565b5060405180606001604052806034815260200162004589603491398051620000d991601c91602090910190620003e6565b506040516200461438038062004614833981016040819052620000fc9162000532565b60408051808201825260068082526514d0d49055d360d21b6020808401828152855180870190965292855284015281519192916200013d91600091620003e6565b50805162000153906001906020840190620003e6565b505050620001706200016a6200039060201b60201c565b62000394565b600780546001600160a01b0319166001600160a01b038316179055604080516102a08101825260fa8082526101f46020830181905292820183905260608201839052608082018390526102ee60a0830181905260c0830184905260e0830182905261010083018490526101208301849052610140830184905261016083018290526102586101808401526101a08301526101c082018390526101e08201839052610200820183905261022082015261024081018290526102608101919091526101906102808201526200024890601290601562000475565b506040805160808101825261157c8152610dac60208201526102bc9181019190915261012c60608201526200028290601390600462000475565b50604080516060810182526103e88152610dac602082015261157c91810191909152620002b490601490600362000475565b50604080516080810182526110688152610ce460208201526107d0918101919091526101f46060820152620002ee90601590600462000475565b506040805180820190915261138880825260208201526200031490601690600262000475565b5060408051608081018252611d4c81526101f460208201526102bc9181019190915261051460608201526200034e90601790600462000475565b50604080516080810182526109c481526107d060208201526101f49181019190915261138860608201526200038890601890600462000475565b5050620005a0565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620003f49062000564565b90600052602060002090601f01602090048101928262000418576000855562000463565b82601f106200043357805160ff191683800117855562000463565b8280016001018555821562000463579182015b828111156200046357825182559160200191906001019062000446565b50620004719291506200051b565b5090565b82805482825590600052602060002090600f01601090048101928215620004635791602002820160005b83821115620004e157835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200049f565b8015620005115782816101000a81549061ffff0219169055600201602081600101049283019260010302620004e1565b5050620004719291505b5b808211156200047157600081556001016200051c565b6000602082840312156200054557600080fd5b81516001600160a01b03811681146200055d57600080fd5b9392505050565b600181811c908216806200057957607f821691505b6020821081036200059a57634e487b7160e01b600052602260045260246000fd5b50919050565b613f5a80620005b06000396000f3fe60806040526004361061025a5760003560e01c80636352211e11610144578063a22cb465116100b6578063d4e780861161007a578063d4e780861461067d578063d9d2628314610692578063e985e9c5146106a5578063f2fde38b146106e0578063f3c81d2a14610700578063f8fb13271461070857600080fd5b8063a22cb465146105f5578063ab81e06214610615578063b88d4fde14610628578063c680691914610648578063c87b56dd1461065d57600080fd5b806372f90ac11161010857806372f90ac11461056957806377b7098b1461058a5780638c874ebd146105a55780638da5cb5b146105ad57806395d89b41146105cb57806395e3f129146105e057600080fd5b80636352211e146104e157806366ba114e1461050157806366e338701461051457806370a0823114610534578063715018a61461055457600080fd5b806322673030116101dd57806332cb6b0c116101a157806332cb6b0c14610460578063349d2748146104765780633cc1251f146104895780633ccfd60b1461049e57806342842e0e146104a657806342d33d25146104c657600080fd5b806322673030146103d657806323b872dd146103ec57806328e56c5e1461040c5780632abff1f21461041f5780632fb098d21461043257600080fd5b8063095ea7b311610224578063095ea7b3146103485780630a3d4cc41461036a57806313fb44bf1461038a57806318160ddd1461039d57806319a260c9146103c157600080fd5b80625ea3071461025f5780626564fd1461029557806301ffc9a7146102cd57806306fdde03146102fd578063081812fc14610312575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612de2565b61071b565b60405161028c9190612e53565b60405180910390f35b3480156102a157600080fd5b506007546102b5906001600160a01b031681565b6040516001600160a01b03909116815260200161028c565b3480156102d957600080fd5b506102ed6102e8366004612e7c565b6107cf565b604051901515815260200161028c565b34801561030957600080fd5b5061027f610821565b34801561031e57600080fd5b506102b561032d366004612de2565b6004602052600090815260409020546001600160a01b031681565b34801561035457600080fd5b50610368610363366004612eb0565b6108af565b005b34801561037657600080fd5b5061027f610385366004612f9d565b610991565b610368610398366004612fe1565b610ab8565b3480156103a957600080fd5b506103b3600d5481565b60405190815260200161028c565b3480156103cd57600080fd5b50610368610ad7565b3480156103e257600080fd5b506103b3600e5481565b3480156103f857600080fd5b50610368610407366004613015565b610b58565b61036861041a366004612fe1565b610d1f565b61036861042d366004612fe1565b610d3a565b34801561043e57600080fd5b5061045261044d366004613051565b610d55565b60405161028c929190613073565b34801561046c57600080fd5b506103b36101a481565b6103686104843660046130ec565b610ea6565b34801561049557600080fd5b506103b361100c565b610368611046565b3480156104b257600080fd5b506103686104c1366004613015565b6112b1565b3480156104d257600080fd5b506103b3665af3107a40000081565b3480156104ed57600080fd5b506102b56104fc366004612de2565b6113a4565b61036861050f366004613137565b6113f6565b34801561052057600080fd5b5061027f61052f366004612fe1565b6115cf565b34801561054057600080fd5b506103b361054f366004613170565b611823565b34801561056057600080fd5b50610368611886565b34801561057557600080fd5b506011546102ed906301000000900460ff1681565b34801561059657600080fd5b506103b36681ac8e7e4d400081565b61036861189a565b3480156105b957600080fd5b506006546001600160a01b03166102b5565b3480156105d757600080fd5b5061027f61194a565b3480156105ec57600080fd5b50610368611957565b34801561060157600080fd5b5061036861061036600461318b565b611b1c565b610368610623366004613137565b611b88565b34801561063457600080fd5b506103686106433660046131c7565b611dbc565b34801561065457600080fd5b506103b3611ea4565b34801561066957600080fd5b5061027f610678366004612de2565b611ed9565b34801561068957600080fd5b506103b3611ffa565b6103686106a0366004612fe1565b61202f565b3480156106b157600080fd5b506102ed6106c0366004613261565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106ec57600080fd5b506103686106fb366004613170565b61204a565b6103686120c3565b610368610716366004613137565b6120ec565b6060336107306006546001600160a01b031690565b6001600160a01b0316148061075357503360009081526009602052604090205443115b6107785760405162461bcd60e51b815260040161076f90613294565b60405180910390fd5b600d5482106107bb5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b60006107c683612273565b9150505b919050565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461082e906132ba565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906132ba565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806108f857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109355760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060336109a66006546001600160a01b031690565b6001600160a01b031614806109c957503360009081526009602052604090205443115b6109e55760405162461bcd60e51b815260040161076f90613294565b60006019601a6109f4856123ee565b86604051602001610a0894939291906133a9565b60408051601f19818403018152828252600754631980070560e11b845291519093506000926001600160a01b03909216916333000e0a91600480830192869291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a8a91908101906137f7565b90508181604051602001610a9f929190613864565b60408051808303601f1901815291905295945050505050565b610ac06124f6565b8051610ad390601a906020840190612d49565b5050565b610adf6124f6565b600f5460ff1615610b325760405162461bcd60e51b815260206004820152601960248201527f6d696e742074696d6520616c7265616479207374617274656400000000000000604482015260640161076f565b42600e556011805463ff00000019166301000000179055600f805460ff19166001179055565b6000818152600260205260409020546001600160a01b03848116911614610bae5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161076f565b6001600160a01b038216610bf85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b336001600160a01b0384161480610c3257506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610c5357506000818152600460205260409020546001600160a01b031633145b610c905760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d276124f6565b8051610ad390601b906020840190612d49565b610d426124f6565b8051610ad390601c906020840190612d49565b60086020528160005260406000208181548110610d7157600080fd5b906000526020600020906002020160009150915050806000018054610d95906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc1906132ba565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b505050505090806001018054610e23906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906132ba565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905082565b610eae6124f6565b60005b8181101561100557600860008581526020019081526020016000206040518060400160405280858585818110610ee957610ee9613893565b9050602002810190610efb91906138a9565b610f0590806138c9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001858585818110610f5157610f51613893565b9050602002810190610f6391906138a9565b610f719060208101906138c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018101855593815260209081902083518051949560020290910193610fd6935084929190910190612d49565b506020828101518051610fef9260018501920190612d49565b5050508080610ffd90613925565b915050610eb1565b505b505050565b600f5460009060ff166110315760405162461bcd60e51b815260040161076f9061393e565b600e546110419062015180613975565b905090565b61104e6124f6565b600061105b6064476139a3565b61106690603c6139b7565b905060006110756064476139a3565b6110809060196139b7565b9050600061108f6064476139a3565b61109a90600a6139b7565b905060006110a96064476139a3565b6110b49060056139b7565b60405190915060009073e4260df86f5261a41d19c2066f1eb2eb4f009e849085908381818185875af1925050503d806000811461110d576040519150601f19603f3d011682016040523d82523d6000602084013e611112565b606091505b50509050806111335760405162461bcd60e51b815260040161076f906139d6565b604051600090734533d1f65906368ebfd61259daee561df3f3559d9085908381818185875af1925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50509050806111af5760405162461bcd60e51b815260040161076f906139d6565b60405160009073888f8aa938dbb18b28bdd111fa4a0d3b8e10c8719085908381818185875af1925050503d8060008114611205576040519150601f19603f3d011682016040523d82523d6000602084013e61120a565b606091505b505090508061122b5760405162461bcd60e51b815260040161076f906139d6565b60405160009073db4782d463628cc5b1de8f1220f755ba3ba4728e9089908381818185875af1925050503d8060008114611281576040519150601f19603f3d011682016040523d82523d6000602084013e611286565b606091505b50509050806112a75760405162461bcd60e51b815260040161076f906139d6565b5050505050505050565b6112bc838383610b58565b6001600160a01b0382163b15806113655750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611335573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135991906139fe565b6001600160e01b031916145b6110075760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b6000818152600260205260409020546001600160a01b0316806107ca5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161076f565b6040516001600160601b0319606085901b16602082015260009060340160405160208183030381529060405280519060200120905061148b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507ff18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f6292508591506125509050565b6114d75760405162461bcd60e51b815260206004820152601d60248201527f4e6f74206f6e20436972636f6c6f72732050726573616c65206c697374000000604482015260640161076f565b6001600160a01b03841633146114ff5760405162461bcd60e51b815260040161076f90613a1b565b665af3107a40000034146115495760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60646a6ccae8d607b1b604482015260640161076f565b336000908152600a602052604090205460ff1615156001036115ad5760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320616c7265616479206d696e7465642070726573616c650000604482015260640161076f565b336000908152600a60205260409020805460ff19166001179055611005612566565b6060336115e46006546001600160a01b031690565b6001600160a01b0316148061160757503360009081526009602052604090205443115b6116235760405162461bcd60e51b815260040161076f90613294565b6060600061163c6116378560006002612754565b612820565b6000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054919250839160ff841690811061168057611680613893565b9060005260206000209060020201600101600860008081526020019081526020016000208360ff16815481106116b8576116b8613893565b90600052602060002090600202016000016040516020016116db93929190613a43565b60408051601f19818403018152919052915060025b60078160ff1610156117f957600061171c6116378760ff8516611714866001613ab1565b60ff16612754565b905083600860008460ff1681526020019081526020016000208260ff168154811061174957611749613893565b9060005260206000209060020201600101600860008560ff1681526020019081526020016000208360ff168154811061178457611784613893565b90600052602060002090600202016000016040516020016117a793929190613ad6565b60405160208183030381529060405293508160ff166006146117e657836040516020016117d49190613b43565b60405160208183030381529060405293505b50806117f181613b68565b9150506116f0565b508160405160200161180b9190613b87565b60405160208183030381529060405292505050919050565b60006001600160a01b03821661186a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161076f565b506001600160a01b031660009081526003602052604090205490565b61188e6124f6565b61189860006128de565b565b6681ac8e7e4d400034146118e45760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b600e546118f4906202a300613975565b42116119425760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74206e6f742073746172746564000000000000000000604482015260640161076f565b611898612566565b6001805461082e906132ba565b60115462010000900460ff16156119b05760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c7265616479206d696e746564206b6e6f62686561640000000000604482015260640161076f565b73db4782d463628cc5b1de8f1220f755ba3ba4728e33146119d057600080fd5b600d546101a46119e1826005613975565b10611a1b5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60005b6005811015611aef576040518060400160405280611a3b33612930565b61ffff90811682526011541660209091015260106000611a5b8486613975565b8152602080820192909252604001600090812083518154949093015161ffff908116620100000263ffffffff199095169381169390931793909317909255601180546008939192611aae91859116613bbb565b92506101000a81548161ffff021916908361ffff160217905550611add338284611ad89190613975565b61298c565b80611ae781613925565b915050611a1e565b506005600d6000828254611b039190613975565b90915550506011805462ff000019166201000017905550565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050611c1d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507fd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c292508591506125509050565b611c5c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081bdb88105b1b1bdddb1a5cdd60821b604482015260640161076f565b6001600160a01b0384163314611c845760405162461bcd60e51b815260040161076f90613a1b565b6681ac8e7e4d40003414611cce5760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b336000908152600c602052604090205460ff161515600103611d3c5760405162461bcd60e51b815260206004820152602160248201527f4164647265737320616c7265616479206d696e74656420616c6c6f77206c69736044820152601d60fa1b606482015260840161076f565b600e54611d4c9062015180613975565b4211611d9a5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f776c697374206d696e74206e6f742073746172746564207965740000604482015260640161076f565b336000908152600c60205260409020805460ff19166001179055611005612566565b611dc7858585610b58565b6001600160a01b0384163b1580611e5e5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611e0f9033908a90899089908990600401613bd8565b6020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906139fe565b6001600160e01b031916145b611e9d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b5050505050565b600f5460009060ff16611ec95760405162461bcd60e51b815260040161076f9061393e565b600e54611041906202a300613975565b6060600d548210611f1e5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b6000611f298361071b565b905060006040518060c00160405280608c8152602001613e99608c913990506000611f7a611f56866123ee565b604051602001611f669190613c2c565b604051602081830303815290604052612a97565b90506000611f9284604051602001611f669190613c2c565b9050611fd0611fa0876123ee565b84601b8585601c611fb08d6123ee565b611fb98c6115cf565b604051602001611f66989796959493929190613c3e565b604051602001611fe09190613d60565b604051602081830303815290604052945050505050919050565b600f5460009060ff1661201f5760405162461bcd60e51b815260040161076f9061393e565b600e54611041906203f480613975565b6120376124f6565b8051610ad3906019906020840190612d49565b6120526124f6565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6120c0816128de565b50565b6120cb6124f6565b6011805463ff00000019811663010000009182900460ff1615909102179055565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506121818383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd892508591506125509050565b6121c55760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdb88119c9959481b5a5b9d081b1a5cdd605a1b604482015260640161076f565b6001600160a01b03841633146121ed5760405162461bcd60e51b815260040161076f90613a1b565b336000908152600b602052604090205460ff1615156001036122515760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320616c72656164792066726565206d696e7465640000000000604482015260640161076f565b336000908152600b60205260409020805460ff19166001179055611005612566565b6040805160208082018352600080835284815260109091529182205460609261ffff8083169262010000900416905b60078160ff1610156123e4576122b782613925565b604080516020810186905290810188905260608101829052909250600090612710906080016040516020818303038152906040528051906020012060001c6122ff9190613da5565b90508160ff1660000361239457600061231c8261ffff1684612bfd565b905060098160ff16111561235e57856123378260ff166123ee565b604051602001612348929190613864565b604051602081830303815290604052955061238e565b8561236b8260ff166123ee565b60405160200161237c929190613db9565b60405160208183030381529060405295505b506123d1565b846123ae6123a68361ffff1685612bfd565b60ff166123ee565b6040516020016123bf929190613864565b60405160208183030381529060405294505b50806123dc81613b68565b9150506122a2565b5091949350505050565b6060816000036124155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561243f578061242981613925565b91506124389050600a836139a3565b9150612419565b6000816001600160401b0381111561245957612459612eda565b6040519080825280601f01601f191660200182016040528015612483576020820181803683370190505b5090505b84156124ee57612498600183613df5565b91506124a5600a86613da5565b6124b0906030613975565b60f81b8183815181106124c5576124c5613893565b60200101906001600160f81b031916908160001a9053506124e7600a866139a3565b9450612487565b949350505050565b6006546001600160a01b031633146118985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60008261255d8584612cd2565b14949350505050565b6011546301000000900460ff1615156001148061258d57506006546001600160a01b031633145b6125cc5760405162461bcd60e51b815260206004820152601060248201526f4d696e74696e67206e6f74206c69766560801b604482015260640161076f565b600f5460ff166126125760405162461bcd60e51b815260206004820152601160248201527026b4b73a34b733903737ba103132b3bab760791b604482015260640161076f565b600e54612622906203f480613975565b421061265f5760405162461bcd60e51b815260206004820152600c60248201526b26b4b73a34b7339037bb32b960a11b604482015260640161076f565b600d546101a481106126a05760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60405180604001604052806126b433612930565b61ffff9081168252601180548216602093840152600085815260108452604080822086518154978701518616620100000263ffffffff19909816908616179690961790955533815260099093529282204390558254600893929161271a91859116613bbb565b92506101000a81548161ffff021916908361ffff16021790555061273e338261298c565b600d6000815461274d90613925565b9091555050565b60608360006127638585613df5565b6001600160401b0381111561277a5761277a612eda565b6040519080825280601f01601f1916602001820160405280156127a4576020820181803683370190505b509050845b84811015612816578281815181106127c3576127c3613893565b01602001516001600160f81b031916826127dd8884613df5565b815181106127ed576127ed613893565b60200101906001600160f81b031916908160001a9053508061280e81613925565b9150506127a9565b5095945050505050565b60008181805b82518160ff1610156128d6576030838260ff168151811061284957612849613893565b016020015160f81c1080159061287c57506039838260ff168151811061287157612871613893565b016020015160f81c11155b156128c45761288c600a83613e0c565b91506030838260ff16815181106128a5576128a5613893565b01602001516128b7919060f81c613e35565b6128c19083613ab1565b91505b806128ce81613b68565b915050612826565b509392505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061271042448560405160200161296993929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c6107c69190613da5565b6001600160a01b0382166129d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b6000818152600260205260409020546001600160a01b031615612a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161076f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608151600003612ab657505060408051602081019091526000815290565b6000604051806060016040528060408152602001613e596040913990506000600384516002612ae59190613975565b612aef91906139a3565b612afa9060046139b7565b90506000612b09826020613975565b6001600160401b03811115612b2057612b20612eda565b6040519080825280601f01601f191660200182016040528015612b4a576020820181803683370190505b509050818152600183018586518101602084015b81831015612bb85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612b5e565b600389510660018114612bd25760028114612be357612bef565b613d3d60f01b600119830152612bef565b603d60f81b6000198301525b509398975050505050505050565b60008080601260ff851660078110612c1757612c17613893565b0154905060005b818160ff161015612ccc57600060128660ff1660078110612c4157612c41613893565b018260ff1681548110612c5657612c56613893565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508361ffff168710158015612c9c5750612c958185613bbb565b61ffff1687105b15612cac5750925061081b915050565b612cb68185613bbb565b9350508080612cc490613b68565b915050612c1e565b50600080fd5b600081815b84518110156128d657612d0382868381518110612cf657612cf6613893565b6020026020010151612d17565b915080612d0f81613925565b915050612cd7565b6000818310612d33576000828152602084905260409020612d42565b60008381526020839052604090205b9392505050565b828054612d55906132ba565b90600052602060002090601f016020900481019282612d775760008555612dbd565b82601f10612d9057805160ff1916838001178555612dbd565b82800160010185558215612dbd579182015b82811115612dbd578251825591602001919060010190612da2565b50612dc9929150612dcd565b5090565b5b80821115612dc95760008155600101612dce565b600060208284031215612df457600080fd5b5035919050565b60005b83811015612e16578181015183820152602001612dfe565b838111156110055750506000910152565b60008151808452612e3f816020860160208601612dfb565b601f01601f19169290920160200192915050565b602081526000612d426020830184612e27565b6001600160e01b0319811681146120c057600080fd5b600060208284031215612e8e57600080fd5b8135612d4281612e66565b80356001600160a01b03811681146107ca57600080fd5b60008060408385031215612ec357600080fd5b612ecc83612e99565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1857612f18612eda565b604052919050565b60006001600160401b03821115612f3957612f39612eda565b50601f01601f191660200190565b600082601f830112612f5857600080fd5b8135612f6b612f6682612f20565b612ef0565b818152846020838601011115612f8057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612fb057600080fd5b82356001600160401b03811115612fc657600080fd5b612fd285828601612f47565b95602094909401359450505050565b600060208284031215612ff357600080fd5b81356001600160401b0381111561300957600080fd5b6124ee84828501612f47565b60008060006060848603121561302a57600080fd5b61303384612e99565b925061304160208501612e99565b9150604084013590509250925092565b6000806040838503121561306457600080fd5b50508035926020909101359150565b6040815260006130866040830185612e27565b82810360208401526130988185612e27565b95945050505050565b60008083601f8401126130b357600080fd5b5081356001600160401b038111156130ca57600080fd5b6020830191508360208260051b85010111156130e557600080fd5b9250929050565b60008060006040848603121561310157600080fd5b8335925060208401356001600160401b0381111561311e57600080fd5b61312a868287016130a1565b9497909650939450505050565b60008060006040848603121561314c57600080fd5b61315584612e99565b925060208401356001600160401b0381111561311e57600080fd5b60006020828403121561318257600080fd5b612d4282612e99565b6000806040838503121561319e57600080fd5b6131a783612e99565b9150602083013580151581146131bc57600080fd5b809150509250929050565b6000806000806000608086880312156131df57600080fd5b6131e886612e99565b94506131f660208701612e99565b93506040860135925060608601356001600160401b038082111561321957600080fd5b818801915088601f83011261322d57600080fd5b81358181111561323c57600080fd5b89602082850101111561324e57600080fd5b9699959850939650602001949392505050565b6000806040838503121561327457600080fd5b61327d83612e99565b915061328b60208401612e99565b90509250929050565b6020808252600c908201526b6e6f7420736f20666173742160a01b604082015260600190565b600181811c908216806132ce57607f821691505b6020821081036132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061330e57607f831692505b6020808410820361332f57634e487b7160e01b600052602260045260246000fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6000815161339f818560208601612dfb565b9290920192915050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f25334525334373637269707425323073726325334425323200000000000000006020820152600061340160388301876132f4565b7412991912991834b73a32b3b934ba3c9299a212991960591b815261342960158201876132f4565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253041253343253246736372697074253345253041253343737460208201527f796c65253345253041626f64792532302537422530412532302532306d61726760408201527f696e2533412532303025334225304125323025323070616464696e672533412560608201527f3230302533422530412532302532306261636b67726f756e642533412532302560808201527f32333030302533422530412532302532306f766572666c6f772533412532306860a08201527f696464656e25334225304125374425304125304125323366732532302537422560c08201527f3041253230253230706f736974696f6e2533412532306669786564253342253060e08201527f41253230253230746f70253341253230302533422530412532302532307269676101008201527f687425334125323030253342253041253230253230626f74746f6d25334125326101208201527f30302533422530412532302532306c65667425334125323030253342253041256101408201527f32302532306261636b67726f756e642d636f6c6f72253341253230626c61636b6101608201527f253342253041253230253230646973706c6179253341253230666c65782533426101808201527f2530412532302532306a7573746966792d636f6e74656e7425334125323063656101a08201527f6e746572253342253041253230253230616c69676e2d6974656d7325334125326101c08201527f3063656e746572253342253041253744253041253041253233667325323063616101e08201527f6e7661732532302537422530412532302532306f626a6563742d6669742533416102008201527f253230636f6e7461696e2533422530412532302532306d61782d6865696768746102208201527f2533412532303130302532352533422530412532302532306d61782d776964746102408201527f68253341253230313030253235253342253041253744253041253343253246736102608201527f74796c6525334525334325324668656164253345253343626f647925334525336102808201527f43646976253230696425334425323266732532322533452533432532466469766102a08201527f25334525334373637269707425334576617225323074492533440000000000006102c08201526137ec6137da6137d46137b86102da85018961338d565b6f1299a13b30b9129918341299a212991960811b815260100190565b8661338d565b651299191299a160d11b815260060190565b979650505050505050565b60006020828403121561380957600080fd5b81516001600160401b0381111561381f57600080fd5b8201601f8101841361383057600080fd5b805161383e612f6682612f20565b81815285602083850101111561385357600080fd5b613098826020830160208601612dfb565b60008351613876818460208801612dfb565b83519083019061388a818360208801612dfb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126138bf57600080fd5b9190910192915050565b6000808335601e198436030181126138e057600080fd5b8301803591506001600160401b038211156138fa57600080fd5b6020019150368190038213156130e557600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139375761393761390f565b5060010190565b6020808252601c908201527f4d696e74207374617274206e6f7420696e697469617465642079657400000000604082015260600190565b600082198211156139885761398861390f565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826139b2576139b261398d565b500490565b60008160001904831182151516156139d1576139d161390f565b500290565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b600060208284031215613a1057600080fd5b8151612d4281612e66565b6020808252600e908201526d53656c66206d696e74206f6e6c7960901b604082015260600190565b60008451613a55818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613a7b600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613a9b600b8201856132f4565b62089f4b60ea1b81526003019695505050505050565b600060ff821660ff84168060ff03821115613ace57613ace61390f565b019392505050565b60008451613ae8818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0e600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613b2e600b8201856132f4565b61227d60f01b81526002019695505050505050565b60008251613b55818460208701612dfb565b600b60fa1b920191825250600101919050565b600060ff821660ff8103613b7e57613b7e61390f565b60010192915050565b605b60f81b815260008251613ba3816001850160208701612dfb565b605d60f81b6001939091019283015250600201919050565b600061ffff80831681851680830382111561388a5761388a61390f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600082516138bf818460208701612dfb565b717b226e616d65223a202253435241574c202360701b81528851600090613c6c816012850160208e01612dfb565b895190830190613c83816012840160208e01612dfb565b701130b734b6b0ba34b7b72fbab936111d1160791b60129290910191820152613caf602382018a6132f4565b90508751613cc1818360208c01612dfb565b6226743d60e81b91019081528651613ce0816003840160208b01612dfb565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613d06600e8201876132f4565b90508451613d18818360208901612dfb565b721738373391161130ba3a3934b13aba32b9911d60691b9101908152613d51613d44601383018661338d565b607d60f81b815260010190565b9b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613d9881601d850160208701612dfb565b91909101601d0192915050565b600082613db457613db461398d565b500690565b60008351613dcb818460208801612dfb565b600360fc1b9083019081528351613de9816001840160208801612dfb565b01600101949350505050565b600082821015613e0757613e0761390f565b500390565b600060ff821660ff84168160ff0481118215151615613e2d57613e2d61390f565b029392505050565b600060ff821660ff841680821015613e4f57613e4f61390f565b9003939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223432302053435241574c2070696563657320627920706978656c77616e6b207820436972636f6c6f72732e205472616974732067656e657261746564206f6e20636861696e2026206d657461646174612c20696d61676573206d6972726f726564206f6e20636861696e207065726d616e656e746c792e222ca26469706673582212205d4e88c2a22a2a72e6e0a732424b12885553e121d9d6fc60b32fdc819a56110d64736f6c634300080d00337368613235362d6d61553247786155437a355743686b41475234306e7439736257525045664638716f253246707278686f4b5051253344687474707325334125324625324663646e6a732e636c6f7564666c6172652e636f6d253246616a61782532466c69627325324670352e6a73253246312e342e3025324670352e6a7368747470733a2f2f73637261776c2d62792d706978656c77616e6b2e73332e616d617a6f6e6177732e636f6d2f6f75747075742f68747470733a2f2f636972636f6c6f72732e6d7970696e6174612e636c6f75642f697066732f516d617941644d63503551705752636a66385738686b63574c69704c454d634e636d3158617454774c4250317a473f783d00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72
Deployed Bytecode
0x60806040526004361061025a5760003560e01c80636352211e11610144578063a22cb465116100b6578063d4e780861161007a578063d4e780861461067d578063d9d2628314610692578063e985e9c5146106a5578063f2fde38b146106e0578063f3c81d2a14610700578063f8fb13271461070857600080fd5b8063a22cb465146105f5578063ab81e06214610615578063b88d4fde14610628578063c680691914610648578063c87b56dd1461065d57600080fd5b806372f90ac11161010857806372f90ac11461056957806377b7098b1461058a5780638c874ebd146105a55780638da5cb5b146105ad57806395d89b41146105cb57806395e3f129146105e057600080fd5b80636352211e146104e157806366ba114e1461050157806366e338701461051457806370a0823114610534578063715018a61461055457600080fd5b806322673030116101dd57806332cb6b0c116101a157806332cb6b0c14610460578063349d2748146104765780633cc1251f146104895780633ccfd60b1461049e57806342842e0e146104a657806342d33d25146104c657600080fd5b806322673030146103d657806323b872dd146103ec57806328e56c5e1461040c5780632abff1f21461041f5780632fb098d21461043257600080fd5b8063095ea7b311610224578063095ea7b3146103485780630a3d4cc41461036a57806313fb44bf1461038a57806318160ddd1461039d57806319a260c9146103c157600080fd5b80625ea3071461025f5780626564fd1461029557806301ffc9a7146102cd57806306fdde03146102fd578063081812fc14610312575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612de2565b61071b565b60405161028c9190612e53565b60405180910390f35b3480156102a157600080fd5b506007546102b5906001600160a01b031681565b6040516001600160a01b03909116815260200161028c565b3480156102d957600080fd5b506102ed6102e8366004612e7c565b6107cf565b604051901515815260200161028c565b34801561030957600080fd5b5061027f610821565b34801561031e57600080fd5b506102b561032d366004612de2565b6004602052600090815260409020546001600160a01b031681565b34801561035457600080fd5b50610368610363366004612eb0565b6108af565b005b34801561037657600080fd5b5061027f610385366004612f9d565b610991565b610368610398366004612fe1565b610ab8565b3480156103a957600080fd5b506103b3600d5481565b60405190815260200161028c565b3480156103cd57600080fd5b50610368610ad7565b3480156103e257600080fd5b506103b3600e5481565b3480156103f857600080fd5b50610368610407366004613015565b610b58565b61036861041a366004612fe1565b610d1f565b61036861042d366004612fe1565b610d3a565b34801561043e57600080fd5b5061045261044d366004613051565b610d55565b60405161028c929190613073565b34801561046c57600080fd5b506103b36101a481565b6103686104843660046130ec565b610ea6565b34801561049557600080fd5b506103b361100c565b610368611046565b3480156104b257600080fd5b506103686104c1366004613015565b6112b1565b3480156104d257600080fd5b506103b3665af3107a40000081565b3480156104ed57600080fd5b506102b56104fc366004612de2565b6113a4565b61036861050f366004613137565b6113f6565b34801561052057600080fd5b5061027f61052f366004612fe1565b6115cf565b34801561054057600080fd5b506103b361054f366004613170565b611823565b34801561056057600080fd5b50610368611886565b34801561057557600080fd5b506011546102ed906301000000900460ff1681565b34801561059657600080fd5b506103b36681ac8e7e4d400081565b61036861189a565b3480156105b957600080fd5b506006546001600160a01b03166102b5565b3480156105d757600080fd5b5061027f61194a565b3480156105ec57600080fd5b50610368611957565b34801561060157600080fd5b5061036861061036600461318b565b611b1c565b610368610623366004613137565b611b88565b34801561063457600080fd5b506103686106433660046131c7565b611dbc565b34801561065457600080fd5b506103b3611ea4565b34801561066957600080fd5b5061027f610678366004612de2565b611ed9565b34801561068957600080fd5b506103b3611ffa565b6103686106a0366004612fe1565b61202f565b3480156106b157600080fd5b506102ed6106c0366004613261565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106ec57600080fd5b506103686106fb366004613170565b61204a565b6103686120c3565b610368610716366004613137565b6120ec565b6060336107306006546001600160a01b031690565b6001600160a01b0316148061075357503360009081526009602052604090205443115b6107785760405162461bcd60e51b815260040161076f90613294565b60405180910390fd5b600d5482106107bb5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b60006107c683612273565b9150505b919050565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461082e906132ba565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906132ba565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806108f857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109355760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060336109a66006546001600160a01b031690565b6001600160a01b031614806109c957503360009081526009602052604090205443115b6109e55760405162461bcd60e51b815260040161076f90613294565b60006019601a6109f4856123ee565b86604051602001610a0894939291906133a9565b60408051601f19818403018152828252600754631980070560e11b845291519093506000926001600160a01b03909216916333000e0a91600480830192869291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a8a91908101906137f7565b90508181604051602001610a9f929190613864565b60408051808303601f1901815291905295945050505050565b610ac06124f6565b8051610ad390601a906020840190612d49565b5050565b610adf6124f6565b600f5460ff1615610b325760405162461bcd60e51b815260206004820152601960248201527f6d696e742074696d6520616c7265616479207374617274656400000000000000604482015260640161076f565b42600e556011805463ff00000019166301000000179055600f805460ff19166001179055565b6000818152600260205260409020546001600160a01b03848116911614610bae5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161076f565b6001600160a01b038216610bf85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b336001600160a01b0384161480610c3257506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610c5357506000818152600460205260409020546001600160a01b031633145b610c905760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d276124f6565b8051610ad390601b906020840190612d49565b610d426124f6565b8051610ad390601c906020840190612d49565b60086020528160005260406000208181548110610d7157600080fd5b906000526020600020906002020160009150915050806000018054610d95906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc1906132ba565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b505050505090806001018054610e23906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906132ba565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905082565b610eae6124f6565b60005b8181101561100557600860008581526020019081526020016000206040518060400160405280858585818110610ee957610ee9613893565b9050602002810190610efb91906138a9565b610f0590806138c9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001858585818110610f5157610f51613893565b9050602002810190610f6391906138a9565b610f719060208101906138c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018101855593815260209081902083518051949560020290910193610fd6935084929190910190612d49565b506020828101518051610fef9260018501920190612d49565b5050508080610ffd90613925565b915050610eb1565b505b505050565b600f5460009060ff166110315760405162461bcd60e51b815260040161076f9061393e565b600e546110419062015180613975565b905090565b61104e6124f6565b600061105b6064476139a3565b61106690603c6139b7565b905060006110756064476139a3565b6110809060196139b7565b9050600061108f6064476139a3565b61109a90600a6139b7565b905060006110a96064476139a3565b6110b49060056139b7565b60405190915060009073e4260df86f5261a41d19c2066f1eb2eb4f009e849085908381818185875af1925050503d806000811461110d576040519150601f19603f3d011682016040523d82523d6000602084013e611112565b606091505b50509050806111335760405162461bcd60e51b815260040161076f906139d6565b604051600090734533d1f65906368ebfd61259daee561df3f3559d9085908381818185875af1925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50509050806111af5760405162461bcd60e51b815260040161076f906139d6565b60405160009073888f8aa938dbb18b28bdd111fa4a0d3b8e10c8719085908381818185875af1925050503d8060008114611205576040519150601f19603f3d011682016040523d82523d6000602084013e61120a565b606091505b505090508061122b5760405162461bcd60e51b815260040161076f906139d6565b60405160009073db4782d463628cc5b1de8f1220f755ba3ba4728e9089908381818185875af1925050503d8060008114611281576040519150601f19603f3d011682016040523d82523d6000602084013e611286565b606091505b50509050806112a75760405162461bcd60e51b815260040161076f906139d6565b5050505050505050565b6112bc838383610b58565b6001600160a01b0382163b15806113655750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611335573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135991906139fe565b6001600160e01b031916145b6110075760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b6000818152600260205260409020546001600160a01b0316806107ca5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161076f565b6040516001600160601b0319606085901b16602082015260009060340160405160208183030381529060405280519060200120905061148b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507ff18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f6292508591506125509050565b6114d75760405162461bcd60e51b815260206004820152601d60248201527f4e6f74206f6e20436972636f6c6f72732050726573616c65206c697374000000604482015260640161076f565b6001600160a01b03841633146114ff5760405162461bcd60e51b815260040161076f90613a1b565b665af3107a40000034146115495760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60646a6ccae8d607b1b604482015260640161076f565b336000908152600a602052604090205460ff1615156001036115ad5760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320616c7265616479206d696e7465642070726573616c650000604482015260640161076f565b336000908152600a60205260409020805460ff19166001179055611005612566565b6060336115e46006546001600160a01b031690565b6001600160a01b0316148061160757503360009081526009602052604090205443115b6116235760405162461bcd60e51b815260040161076f90613294565b6060600061163c6116378560006002612754565b612820565b6000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054919250839160ff841690811061168057611680613893565b9060005260206000209060020201600101600860008081526020019081526020016000208360ff16815481106116b8576116b8613893565b90600052602060002090600202016000016040516020016116db93929190613a43565b60408051601f19818403018152919052915060025b60078160ff1610156117f957600061171c6116378760ff8516611714866001613ab1565b60ff16612754565b905083600860008460ff1681526020019081526020016000208260ff168154811061174957611749613893565b9060005260206000209060020201600101600860008560ff1681526020019081526020016000208360ff168154811061178457611784613893565b90600052602060002090600202016000016040516020016117a793929190613ad6565b60405160208183030381529060405293508160ff166006146117e657836040516020016117d49190613b43565b60405160208183030381529060405293505b50806117f181613b68565b9150506116f0565b508160405160200161180b9190613b87565b60405160208183030381529060405292505050919050565b60006001600160a01b03821661186a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161076f565b506001600160a01b031660009081526003602052604090205490565b61188e6124f6565b61189860006128de565b565b6681ac8e7e4d400034146118e45760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b600e546118f4906202a300613975565b42116119425760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74206e6f742073746172746564000000000000000000604482015260640161076f565b611898612566565b6001805461082e906132ba565b60115462010000900460ff16156119b05760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c7265616479206d696e746564206b6e6f62686561640000000000604482015260640161076f565b73db4782d463628cc5b1de8f1220f755ba3ba4728e33146119d057600080fd5b600d546101a46119e1826005613975565b10611a1b5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60005b6005811015611aef576040518060400160405280611a3b33612930565b61ffff90811682526011541660209091015260106000611a5b8486613975565b8152602080820192909252604001600090812083518154949093015161ffff908116620100000263ffffffff199095169381169390931793909317909255601180546008939192611aae91859116613bbb565b92506101000a81548161ffff021916908361ffff160217905550611add338284611ad89190613975565b61298c565b80611ae781613925565b915050611a1e565b506005600d6000828254611b039190613975565b90915550506011805462ff000019166201000017905550565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050611c1d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507fd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c292508591506125509050565b611c5c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081bdb88105b1b1bdddb1a5cdd60821b604482015260640161076f565b6001600160a01b0384163314611c845760405162461bcd60e51b815260040161076f90613a1b565b6681ac8e7e4d40003414611cce5760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b336000908152600c602052604090205460ff161515600103611d3c5760405162461bcd60e51b815260206004820152602160248201527f4164647265737320616c7265616479206d696e74656420616c6c6f77206c69736044820152601d60fa1b606482015260840161076f565b600e54611d4c9062015180613975565b4211611d9a5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f776c697374206d696e74206e6f742073746172746564207965740000604482015260640161076f565b336000908152600c60205260409020805460ff19166001179055611005612566565b611dc7858585610b58565b6001600160a01b0384163b1580611e5e5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611e0f9033908a90899089908990600401613bd8565b6020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906139fe565b6001600160e01b031916145b611e9d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b5050505050565b600f5460009060ff16611ec95760405162461bcd60e51b815260040161076f9061393e565b600e54611041906202a300613975565b6060600d548210611f1e5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b6000611f298361071b565b905060006040518060c00160405280608c8152602001613e99608c913990506000611f7a611f56866123ee565b604051602001611f669190613c2c565b604051602081830303815290604052612a97565b90506000611f9284604051602001611f669190613c2c565b9050611fd0611fa0876123ee565b84601b8585601c611fb08d6123ee565b611fb98c6115cf565b604051602001611f66989796959493929190613c3e565b604051602001611fe09190613d60565b604051602081830303815290604052945050505050919050565b600f5460009060ff1661201f5760405162461bcd60e51b815260040161076f9061393e565b600e54611041906203f480613975565b6120376124f6565b8051610ad3906019906020840190612d49565b6120526124f6565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6120c0816128de565b50565b6120cb6124f6565b6011805463ff00000019811663010000009182900460ff1615909102179055565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506121818383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd892508591506125509050565b6121c55760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdb88119c9959481b5a5b9d081b1a5cdd605a1b604482015260640161076f565b6001600160a01b03841633146121ed5760405162461bcd60e51b815260040161076f90613a1b565b336000908152600b602052604090205460ff1615156001036122515760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320616c72656164792066726565206d696e7465640000000000604482015260640161076f565b336000908152600b60205260409020805460ff19166001179055611005612566565b6040805160208082018352600080835284815260109091529182205460609261ffff8083169262010000900416905b60078160ff1610156123e4576122b782613925565b604080516020810186905290810188905260608101829052909250600090612710906080016040516020818303038152906040528051906020012060001c6122ff9190613da5565b90508160ff1660000361239457600061231c8261ffff1684612bfd565b905060098160ff16111561235e57856123378260ff166123ee565b604051602001612348929190613864565b604051602081830303815290604052955061238e565b8561236b8260ff166123ee565b60405160200161237c929190613db9565b60405160208183030381529060405295505b506123d1565b846123ae6123a68361ffff1685612bfd565b60ff166123ee565b6040516020016123bf929190613864565b60405160208183030381529060405294505b50806123dc81613b68565b9150506122a2565b5091949350505050565b6060816000036124155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561243f578061242981613925565b91506124389050600a836139a3565b9150612419565b6000816001600160401b0381111561245957612459612eda565b6040519080825280601f01601f191660200182016040528015612483576020820181803683370190505b5090505b84156124ee57612498600183613df5565b91506124a5600a86613da5565b6124b0906030613975565b60f81b8183815181106124c5576124c5613893565b60200101906001600160f81b031916908160001a9053506124e7600a866139a3565b9450612487565b949350505050565b6006546001600160a01b031633146118985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60008261255d8584612cd2565b14949350505050565b6011546301000000900460ff1615156001148061258d57506006546001600160a01b031633145b6125cc5760405162461bcd60e51b815260206004820152601060248201526f4d696e74696e67206e6f74206c69766560801b604482015260640161076f565b600f5460ff166126125760405162461bcd60e51b815260206004820152601160248201527026b4b73a34b733903737ba103132b3bab760791b604482015260640161076f565b600e54612622906203f480613975565b421061265f5760405162461bcd60e51b815260206004820152600c60248201526b26b4b73a34b7339037bb32b960a11b604482015260640161076f565b600d546101a481106126a05760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60405180604001604052806126b433612930565b61ffff9081168252601180548216602093840152600085815260108452604080822086518154978701518616620100000263ffffffff19909816908616179690961790955533815260099093529282204390558254600893929161271a91859116613bbb565b92506101000a81548161ffff021916908361ffff16021790555061273e338261298c565b600d6000815461274d90613925565b9091555050565b60608360006127638585613df5565b6001600160401b0381111561277a5761277a612eda565b6040519080825280601f01601f1916602001820160405280156127a4576020820181803683370190505b509050845b84811015612816578281815181106127c3576127c3613893565b01602001516001600160f81b031916826127dd8884613df5565b815181106127ed576127ed613893565b60200101906001600160f81b031916908160001a9053508061280e81613925565b9150506127a9565b5095945050505050565b60008181805b82518160ff1610156128d6576030838260ff168151811061284957612849613893565b016020015160f81c1080159061287c57506039838260ff168151811061287157612871613893565b016020015160f81c11155b156128c45761288c600a83613e0c565b91506030838260ff16815181106128a5576128a5613893565b01602001516128b7919060f81c613e35565b6128c19083613ab1565b91505b806128ce81613b68565b915050612826565b509392505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061271042448560405160200161296993929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c6107c69190613da5565b6001600160a01b0382166129d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b6000818152600260205260409020546001600160a01b031615612a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161076f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608151600003612ab657505060408051602081019091526000815290565b6000604051806060016040528060408152602001613e596040913990506000600384516002612ae59190613975565b612aef91906139a3565b612afa9060046139b7565b90506000612b09826020613975565b6001600160401b03811115612b2057612b20612eda565b6040519080825280601f01601f191660200182016040528015612b4a576020820181803683370190505b509050818152600183018586518101602084015b81831015612bb85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612b5e565b600389510660018114612bd25760028114612be357612bef565b613d3d60f01b600119830152612bef565b603d60f81b6000198301525b509398975050505050505050565b60008080601260ff851660078110612c1757612c17613893565b0154905060005b818160ff161015612ccc57600060128660ff1660078110612c4157612c41613893565b018260ff1681548110612c5657612c56613893565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508361ffff168710158015612c9c5750612c958185613bbb565b61ffff1687105b15612cac5750925061081b915050565b612cb68185613bbb565b9350508080612cc490613b68565b915050612c1e565b50600080fd5b600081815b84518110156128d657612d0382868381518110612cf657612cf6613893565b6020026020010151612d17565b915080612d0f81613925565b915050612cd7565b6000818310612d33576000828152602084905260409020612d42565b60008381526020839052604090205b9392505050565b828054612d55906132ba565b90600052602060002090601f016020900481019282612d775760008555612dbd565b82601f10612d9057805160ff1916838001178555612dbd565b82800160010185558215612dbd579182015b82811115612dbd578251825591602001919060010190612da2565b50612dc9929150612dcd565b5090565b5b80821115612dc95760008155600101612dce565b600060208284031215612df457600080fd5b5035919050565b60005b83811015612e16578181015183820152602001612dfe565b838111156110055750506000910152565b60008151808452612e3f816020860160208601612dfb565b601f01601f19169290920160200192915050565b602081526000612d426020830184612e27565b6001600160e01b0319811681146120c057600080fd5b600060208284031215612e8e57600080fd5b8135612d4281612e66565b80356001600160a01b03811681146107ca57600080fd5b60008060408385031215612ec357600080fd5b612ecc83612e99565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1857612f18612eda565b604052919050565b60006001600160401b03821115612f3957612f39612eda565b50601f01601f191660200190565b600082601f830112612f5857600080fd5b8135612f6b612f6682612f20565b612ef0565b818152846020838601011115612f8057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612fb057600080fd5b82356001600160401b03811115612fc657600080fd5b612fd285828601612f47565b95602094909401359450505050565b600060208284031215612ff357600080fd5b81356001600160401b0381111561300957600080fd5b6124ee84828501612f47565b60008060006060848603121561302a57600080fd5b61303384612e99565b925061304160208501612e99565b9150604084013590509250925092565b6000806040838503121561306457600080fd5b50508035926020909101359150565b6040815260006130866040830185612e27565b82810360208401526130988185612e27565b95945050505050565b60008083601f8401126130b357600080fd5b5081356001600160401b038111156130ca57600080fd5b6020830191508360208260051b85010111156130e557600080fd5b9250929050565b60008060006040848603121561310157600080fd5b8335925060208401356001600160401b0381111561311e57600080fd5b61312a868287016130a1565b9497909650939450505050565b60008060006040848603121561314c57600080fd5b61315584612e99565b925060208401356001600160401b0381111561311e57600080fd5b60006020828403121561318257600080fd5b612d4282612e99565b6000806040838503121561319e57600080fd5b6131a783612e99565b9150602083013580151581146131bc57600080fd5b809150509250929050565b6000806000806000608086880312156131df57600080fd5b6131e886612e99565b94506131f660208701612e99565b93506040860135925060608601356001600160401b038082111561321957600080fd5b818801915088601f83011261322d57600080fd5b81358181111561323c57600080fd5b89602082850101111561324e57600080fd5b9699959850939650602001949392505050565b6000806040838503121561327457600080fd5b61327d83612e99565b915061328b60208401612e99565b90509250929050565b6020808252600c908201526b6e6f7420736f20666173742160a01b604082015260600190565b600181811c908216806132ce57607f821691505b6020821081036132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061330e57607f831692505b6020808410820361332f57634e487b7160e01b600052602260045260246000fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6000815161339f818560208601612dfb565b9290920192915050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f25334525334373637269707425323073726325334425323200000000000000006020820152600061340160388301876132f4565b7412991912991834b73a32b3b934ba3c9299a212991960591b815261342960158201876132f4565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253041253343253246736372697074253345253041253343737460208201527f796c65253345253041626f64792532302537422530412532302532306d61726760408201527f696e2533412532303025334225304125323025323070616464696e672533412560608201527f3230302533422530412532302532306261636b67726f756e642533412532302560808201527f32333030302533422530412532302532306f766572666c6f772533412532306860a08201527f696464656e25334225304125374425304125304125323366732532302537422560c08201527f3041253230253230706f736974696f6e2533412532306669786564253342253060e08201527f41253230253230746f70253341253230302533422530412532302532307269676101008201527f687425334125323030253342253041253230253230626f74746f6d25334125326101208201527f30302533422530412532302532306c65667425334125323030253342253041256101408201527f32302532306261636b67726f756e642d636f6c6f72253341253230626c61636b6101608201527f253342253041253230253230646973706c6179253341253230666c65782533426101808201527f2530412532302532306a7573746966792d636f6e74656e7425334125323063656101a08201527f6e746572253342253041253230253230616c69676e2d6974656d7325334125326101c08201527f3063656e746572253342253041253744253041253041253233667325323063616101e08201527f6e7661732532302537422530412532302532306f626a6563742d6669742533416102008201527f253230636f6e7461696e2533422530412532302532306d61782d6865696768746102208201527f2533412532303130302532352533422530412532302532306d61782d776964746102408201527f68253341253230313030253235253342253041253744253041253343253246736102608201527f74796c6525334525334325324668656164253345253343626f647925334525336102808201527f43646976253230696425334425323266732532322533452533432532466469766102a08201527f25334525334373637269707425334576617225323074492533440000000000006102c08201526137ec6137da6137d46137b86102da85018961338d565b6f1299a13b30b9129918341299a212991960811b815260100190565b8661338d565b651299191299a160d11b815260060190565b979650505050505050565b60006020828403121561380957600080fd5b81516001600160401b0381111561381f57600080fd5b8201601f8101841361383057600080fd5b805161383e612f6682612f20565b81815285602083850101111561385357600080fd5b613098826020830160208601612dfb565b60008351613876818460208801612dfb565b83519083019061388a818360208801612dfb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126138bf57600080fd5b9190910192915050565b6000808335601e198436030181126138e057600080fd5b8301803591506001600160401b038211156138fa57600080fd5b6020019150368190038213156130e557600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139375761393761390f565b5060010190565b6020808252601c908201527f4d696e74207374617274206e6f7420696e697469617465642079657400000000604082015260600190565b600082198211156139885761398861390f565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826139b2576139b261398d565b500490565b60008160001904831182151516156139d1576139d161390f565b500290565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b600060208284031215613a1057600080fd5b8151612d4281612e66565b6020808252600e908201526d53656c66206d696e74206f6e6c7960901b604082015260600190565b60008451613a55818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613a7b600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613a9b600b8201856132f4565b62089f4b60ea1b81526003019695505050505050565b600060ff821660ff84168060ff03821115613ace57613ace61390f565b019392505050565b60008451613ae8818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0e600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613b2e600b8201856132f4565b61227d60f01b81526002019695505050505050565b60008251613b55818460208701612dfb565b600b60fa1b920191825250600101919050565b600060ff821660ff8103613b7e57613b7e61390f565b60010192915050565b605b60f81b815260008251613ba3816001850160208701612dfb565b605d60f81b6001939091019283015250600201919050565b600061ffff80831681851680830382111561388a5761388a61390f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600082516138bf818460208701612dfb565b717b226e616d65223a202253435241574c202360701b81528851600090613c6c816012850160208e01612dfb565b895190830190613c83816012840160208e01612dfb565b701130b734b6b0ba34b7b72fbab936111d1160791b60129290910191820152613caf602382018a6132f4565b90508751613cc1818360208c01612dfb565b6226743d60e81b91019081528651613ce0816003840160208b01612dfb565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613d06600e8201876132f4565b90508451613d18818360208901612dfb565b721738373391161130ba3a3934b13aba32b9911d60691b9101908152613d51613d44601383018661338d565b607d60f81b815260010190565b9b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613d9881601d850160208701612dfb565b91909101601d0192915050565b600082613db457613db461398d565b500690565b60008351613dcb818460208801612dfb565b600360fc1b9083019081528351613de9816001840160208801612dfb565b01600101949350505050565b600082821015613e0757613e0761390f565b500390565b600060ff821660ff84168160ff0481118215151615613e2d57613e2d61390f565b029392505050565b600060ff821660ff841680821015613e4f57613e4f61390f565b9003939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223432302053435241574c2070696563657320627920706978656c77616e6b207820436972636f6c6f72732e205472616974732067656e657261746564206f6e20636861696e2026206d657461646174612c20696d61676573206d6972726f726564206f6e20636861696e207065726d616e656e746c792e222ca26469706673582212205d4e88c2a22a2a72e6e0a732424b12885553e121d9d6fc60b32fdc819a56110d64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72
-----Decoded View---------------
Arg [0] : _scrawlArt (address): 0x17F0533E27c5D42E0132aB969B9bF1bd34B60e72
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72
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.